- Форум
- Pawn-скриптинг, SA:MP
- Вопросы по Pawn-скриптингу
- [Вопрос] sscanf warning: String buffer overflow.
-
13.06.2016, 15:49
#1
Пользователь
sscanf warning: String buffer overflow.
Всем привет. У меня такой вопрос. Как многие знают, я занимаюсь модом Funny RP. Так вот, как написал Daniel_Cortez:
Сам собой напрашивается вопрос: зачем вообще к моду подключен sscanf2? Ради пары отрывков кода, которые лень переделать?
Кстати, sscanf2 используется в моде всего 5 раз.
Вот самое первое место, где он встречается:
PHP код:
public OnPlayerCommandText(playerid, cmdtext[])
{
new string[256];
new tmp[128],idx;
new cmd[128];
new giveplayerid;
cmd = strtok(cmdtext,idx);
// sscanf
new command[32], params[128];
sscanf(cmdtext, «s[32]s[128]», command, params);
Параметры команды отделяются от названия сразу двумя способами, в лучших быдлокодерских традициях.
И присмотритесь внимательно к форматной строке в sscanf: «s[32]s[128]». В переменную params ничего не запишется, вместо этого и название, и параметры окажутся в command. Мало того, если длина команды и параметров в сумме больше 31 символа, sscanf выплюнет сообщение в лог «sscanf warning: String buffer overflow» — и после этого гадай, откуда берётся такое сообщение.
В остальных 4 случаях с помощью sscanf2 в командах (OnPlayerCommandText) обрабатываются параметры из params, но поскольку в params ничего нет, то команды будут работать не так, как задумано.Ну вот попробовал наконец добавить команду с использованием sscanf и у меня в консоли выбило:
PHP код:
sscanf warning: String buffer overflow.
Ну как я понял, переполнение буфера. Но Daniel_Cortez сказал, что sscanf подключен к моду не правильно, по этому будут такие ошибки.
Так как же правильно подключить sscanf к моду? Я гуглил, везде одно и тоже и в моде тоже самое. Прошу по этому вашей помощи. Заранее благодарю.
Вот собственно подключение к sscanf.
PHP код:
public OnPlayerCommandText(playerid, cmdtext[])
{
new string[256];
new tmp[128],idx;
new cmd[128];
new giveplayerid;
cmd = strtok(cmdtext,idx);
// sscanf
new command[32], params[128];
sscanf(cmdtext, "s[32]s[128]", command, params);
Ну а вот тестовая команда:
PHP код:
if(strcmp(cmd, "/msg", true) == 0)
{
static const fmt_str[] = "Администратор %s: %s";
new str[sizeof fmt_str + 16 + MAX_PLAYER_NAME + 50];
if(PlayerInfo[playerid][pAdmin] < 4) return true;
if(sscanf(params, "s[50]", params[0])) return SendClientMessage(playerid, COLOR_GREY, "Используйте: /msg [текст]");
format(str, sizeof(str), fmt_str, PlayerInfo[playerid][pName], params[0]);
SendClientMessageToAll(0xFFCC00AA, str);
return true;
}
Если тут написать текст больше 50, то в консоли выбивает про буфер. Я пробовал изменять на 128 и т.д., но все равно, если больше напишешь символов, то будет снова это сообщение. P.S. используется sscanf 2.8.1
-
15.06.2016, 17:53
#2
Пользователь
Ну и? Кто нибудь поможет? Где все профессионалы?
-
15.06.2016, 18:11
#3
Пользователь
Сообщение от Danny_Marcelo
Ну и? Кто нибудь поможет? Где все профессионалы?
Поэтому и надо делать ограничение на кол-во символов, понятное же дело
-
15.06.2016, 21:59
#4
Пользователь
Код:
if(sscanf(params, "?<SSCANF_QUIET=1>s[50]", params[0])) return SendClientMessage(playerid, COLOR_GREY, "Используйте: /msg [текст]");
-
Пользователь сказал cпасибо:
-
16.06.2016, 09:18
#5
Сообщение от Danny_Marcelo
Так как же правильно подключить sscanf к моду?
PHP код:
#include <sscanf2>
Худшее, что здесь можно сделать — неправильно написать название инклуда или забыть скопировать сам инклуд в pawno/include. В любом случае компилятор укажет на такую ошибку.
Сообщение от Danny_Marcelo
Вот собственно подключение к sscanf.
PHP код:
public OnPlayerCommandText(playerid, cmdtext[])
{
new string[256];
new tmp[128],idx;
new cmd[128];
new giveplayerid;
cmd = strtok(cmdtext,idx);
// sscanf
new command[32], params[128];
sscanf(cmdtext, "s[32]s[128]", command, params);
«Подключение» и «использование» — совершенно разные вещи…
Сообщение от Danny_Marcelo
Ну а вот тестовая команда:
PHP код:
if(strcmp(cmd, "/msg", true) == 0)
{
static const fmt_str[] = "Администратор %s: %s";
new str[sizeof fmt_str + 16 + MAX_PLAYER_NAME + 50];
if(PlayerInfo[playerid][pAdmin] < 4) return true;
if(sscanf(params, "s[50]", params[0])) return SendClientMessage(playerid, COLOR_GREY, "Используйте: /msg [текст]");
format(str, sizeof(str), fmt_str, PlayerInfo[playerid][pName], params[0]);
SendClientMessageToAll(0xFFCC00AA, str);
return true;
}
Если тут написать текст больше 50, то в консоли выбивает про буфер.
Ну так правильно, нужно делать буфер под столько символов, сколько игрок может ввести, а не сколько захочет левая пятка.
Сообщение от Danny_Marcelo
Я пробовал изменять на 128 и т.д., но все равно, если больше напишешь символов, то будет снова это сообщение.
Каждая строка должна заканчиваться нуль-символом » (должна же машина как-то знать, где заканчивается последовательность символов), под который нужна ещё одна ячейка в массиве. В итоге в OPCT массивы command и params должны быть оба размером в 129 ячеек.
Есть ещё вариант посложнее, но использующий только один массив в 129 ячеек вместо двух. Вместо того, чтобы использовать sscanf2, можно скопировать всё содержимое cmdtext в массив command, пройтись циклом по массиву, найти первый пробел и записать на его месте », затем пропустить лишние пробелы между командой и параметрами (да, их там может быть больше одного) и записать позицию, где начинаются параметры команды, в переменную params_start_pos. В итоге сама команда будет в массиве command, а вместо params можно будет использовать command[params_start_pos].
А вообще для подобных манипуляций есть командные процессоры, кои я и советую вам использовать.Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы
здесь (click)
.
-
Пользователь сказал cпасибо:
-
16.06.2016, 18:59
#6
Пользователь
new cmd[64],params[64],idx;
cmd = strtok(cmdtext, idx);
sscanf(cmdtext,»s[32]s[64]»,cmd,params);
-
Пользователь сказал cпасибо:
-
17.06.2016, 13:07
#7
Сообщение от Battista
new cmd[64],params[64],idx;
cmd = strtok(cmdtext, idx);
sscanf(cmdtext,»s[32]s[64]»,cmd,params);Команда может быть длиннее 31 символа, а параметры — длиннее 63 (сразу будет заметно в чатовых командах типа /s, /a, /pm, /sms и т.п.).
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы
здесь (click)
.
-
17.06.2016, 13:24
#8
Сообщение от Daniel_Cortez
Команда может быть длиннее 31 символа, а параметры — длиннее 63 (сразу будет заметно в чатовых командах типа /s, /a, /pm, /sms и т.п.).
Почему 63? Разве длинна строки параметра — это не остаток от лимита ввода в чат (128) минус лимит длины имени функции (31)?
-
17.06.2016, 13:37
#9
Сообщение от Anton Styazhkin
Почему 63? Разве длинна строки параметра — это не остаток от лимита ввода в чат (128) минус лимит длины имени функции (31)?
Именно.
Кстати, по поводу моего первого поста в этой теме, небольшая поправка: если команда может быть длиной от 2 до 128 символов, то максимальная длина параметров будет равна 129 — 2 — 1 = 126 символов. В итоге под массив params потребуется не 129, а 126 ячеек.Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы
здесь (click)
.
-
17.06.2016, 13:44
#10
Сообщение от Daniel_Cortez
Именно.
Кстати, по поводу моего первого поста в этой теме, небольшая поправка: если команда может быть длиной от 2 до 128 символов, то максимальная длина параметров будет равна 129 — 2 — 1 = 126 символов. В итоге под массив params потребуется не 129, а 126 ячеек.Учет пробелов и ‘/’ всегда должен быть, если ты об этом.
Информация о теме
Пользователи, просматривающие эту тему
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)
Ваши права
- Вы не можете создавать новые темы
- Вы не можете отвечать в темах
- Вы не можете прикреплять вложения
- Вы не можете редактировать свои сообщения
- BB коды Вкл.
- Смайлы Вкл.
- [IMG] код Вкл.
- [VIDEO] код Вкл.
- HTML код Выкл.
Правила форума
#1
Отправлено 23 апреля 2017 — 22:39
- Прохожий
-
Здравствуйте, при игре на сервере минут через 10 отключается сервер(приходится перезагружать на сервере) и выдает такой ЛОГ
[22:01:25] [connection] 93.100.213.40:52006 requests connection cookie.
[22:01:26] [connection] incoming connection: 93.100.213.40:52006 id: 0
[22:01:26] [join] Jayson_Keemble has joined the server (0:93.100.213.40)
[22:01:36] FindPlayerInTable | Jayson_Keemble[0] — 2
[22:01:42] [RegCheck] Jayson_Keemble > Jayson_Keemble
[22:01:42] Name: Jayson_Keemble [0] | pID: [2]
[22:01:49] sscanf warning: String buffer overflow.
[22:01:49] sscanf warning: String buffer overflow.
[22:03:47] id=’0′,subid=’1′
[22:15:49] id=’0′,subid=’0′
0
#2
Отправлено 24 апреля 2017 — 00:23
- Местный
-
sscanf warning: String buffer overflow
Название говорит за себя. Переполнен буфер. В вызове функции вы указываете, что строка может иметь длину, например, 15 символов (s[15]) а на деле в sscanf поступает строка из 16 или 1000 символов. В общем, превышен предел
Сообщение отредактировал leonid767: 24 апреля 2017 — 00:24
0
#3
Отправлено 24 апреля 2017 — 13:04
- Assassin Of Scripters
-
leonid767 (24 апреля 2017 — 00:23) писал:
sscanf warning: String buffer overflow
Название говорит за себя. Переполнен буфер. В вызове функции вы указываете, что строка может иметь длину, например, 15 символов (s[15]) а на деле в sscanf поступает строка из 16 или 1000 символов. В общем, превышен предел
Что?
s[15] — это минимум кол-во ячеек которое должно поступить.
Он указал в sscanf(params, «s», result), а result содержит 15 ячеек, тем самым буфер будет переполнен.
0
#4
Отправлено 24 апреля 2017 — 14:02
- Знаток
-
Long- (24 апреля 2017 — 13:04) писал:
Что?
s[15] — это минимум кол-во ячеек которое должно поступить.
Он указал в sscanf(params, «s», result), а result содержит 15 ячеек, тем самым буфер будет переполнен.
s[15] — это МАКСИМУМ кол-во ячеек которое должно поступить.
0
#5
Отправлено 24 апреля 2017 — 14:53
- По всем вопросам пишите в профиль. Консультации в ВК не провожу.
-
Manifest_Elgujak (24 апреля 2017 — 14:02) писал:
s[15] — это МАКСИМУМ кол-во ячеек которое должно поступить.
А что тебя тут не устраивает?
Если юзер решит увеличить строку — он вновь получит извещение о недостатке ячеек, поэтому, 15 — это экстремум, в данном случае.
0
#6
Отправлено 24 апреля 2017 — 15:48
- Прохожий
-
Я так и непонял, что нужно делать)
0
#7
Отправлено 24 апреля 2017 — 19:11
- Местный
-
Все поспорили и не кто не ответил)
А крашит не по этому ищи ошибку дальше. Это варн который говорит о не правильной работе
Вот пример исправления его
например у тебя есть переменная
new st[3]; — ты в нее можешь записать 3 символа например слово баг
а ты пытаешься записать бага на один символ больше вот он и пишет варн
Чтоб не было такого new st[3]; надо заминать на new st[4]; или больше.
Можно еще по другому например
new st[] = «баги», stim[3];
sscanf(st, «s[3]»,stim);
То есть мы доем понять что в переменную stim можно вставить только 3 символа.
Надеюсь помог
Сообщение отредактировал leonid767: 24 апреля 2017 — 19:14
0
#8
Отправлено 24 апреля 2017 — 19:43
- Прохожий
-
leonid767 (24 апреля 2017 — 19:11) писал:
Все поспорили и не кто не ответил)
А крашит не по этому ищи ошибку дальше. Это варн который говорит о не правильной работе
Вот пример исправления его
например у тебя есть переменная
new st[3]; — ты в нее можешь записать 3 символа например слово баг
а ты пытаешься записать бага на один символ больше вот он и пишет варн
Чтоб не было такого new st[3]; надо заминать на new st[4]; или больше.
Можно еще по другому например
new st[] = «баги», stim[3];
sscanf(st, «s[3]»,stim);
То есть мы доем понять что в переменную stim можно вставить только 3 символа.
Надеюсь помог
Спасибо! Попробую найти с чем же связана ошибка.
0
#9
Отправлено 24 апреля 2017 — 20:52
- Профессионал
-
0
#10
Отправлено 24 апреля 2017 — 21:26
- По всем вопросам пишите в профиль. Консультации в ВК не провожу.
-
leonid767 (24 апреля 2017 — 19:11) писал:
Все поспорили и не кто не ответил)
А крашит не по этому ищи ошибку дальше. Это варн который говорит о не правильной работе
Вот пример исправления его
например у тебя есть переменная
new st[3]; — ты в нее можешь записать 3 символа например слово баг
а ты пытаешься записать бага на один символ больше вот он и пишет варн
Чтоб не было такого new st[3]; надо заминать на new st[4]; или больше.
Можно еще по другому например
new st[] = «баги», stim[3];
sscanf(st, «s[3]»,stim);
То есть мы доем понять что в переменную stim можно вставить только 3 символа.
Надеюсь помог
Всё потому, что индекс ячеек массива начинается с нуль-элемента.
array[4] = array[0] + array[1] + array[2] + array[3].
-1
- ← Предыдущая тема
- Вопросы по скриптингу
- Следующая тема →
- Вы не можете создать новую тему
-
Тема закрыта
1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей
[18:04:15] hostname = «SA:MP Server» (string)
[18:04:15] filterscripts = «» (string)
[18:04:15] weburl = «www.sa-mp.com» (string)
[18:04:15]
[18:04:15] Server Plugins
[18:04:15] —————
[18:04:15] Loading plugin: streamer
[18:04:15]
*** Streamer Plugin v2.8.2 by Incognito loaded ***
[18:04:15] Loaded.
[18:04:15] Loading plugin: sscanf
[18:04:15]
[18:04:15] ===============================
[18:04:15] sscanf plugin loaded.
[18:04:15] Version: 2.8.1
[18:04:15] (c) 2012 Alex «Y_Less» Cole
[18:04:15] ===============================
[18:04:15] Loaded.
[18:04:15] Loading plugin: mysql
[18:04:15]
> MySQL plugin R5 successfully loaded.
[18:04:15] Loaded.
[18:04:15] Loading plugin: crashdetect
[18:04:15] CrashDetect must be loaded before ‘streamer.DLL’
[18:04:15] Failed.
[18:04:15] Loading plugin: crp
[18:04:15]
[18:04:15] ______________________________________
[18:04:15] Convert Rus To Pwn v0.1.1 loaded
[18:04:15] ______________________________________
[18:04:15] By: Fro (c) Copyright <TBG> 2009-2011
[18:04:15] ______________________________________
[18:04:15] Loaded.
[18:04:15] Loaded 4 plugins.
[18:04:15]
[18:04:15] Filterscripts
[18:04:15] —————
[18:04:15] Loaded 0 filterscripts.
[18:04:15] OnGameModeInit() STK 16288
[18:04:15]
———————————-
[18:04:15] [GAMENIX MSG]: Успешная загрузка ‘LoadHouses’ — загружено 76 за 155 м.с
[18:04:15] [GAMENIX MSG]: Успешная загрузка ‘LoadBizz’ — загружено 0 за 4 м.с
[18:04:15] [GAMENIX MSG]: Успешная загрузка ‘LoadVehicle’ — загружено 56 за 112 м.с
[18:04:15] [SMSG]: Успешная загрузка ‘LoadEnters’ — загружено 20 пикапов за 44 м.с
[18:04:15] [SMSG]: Успешная загрузка ‘LoadATM’ — загружено 0 банкоматов за 6 м.с
[18:04:15] [SMSG]: Успешная загрузка ‘LoadPodezd’ — загружено 33 подьездов за 71 м.с
[18:04:17] [SMSG]: Успешная загрузка ‘LoadRooms’ — загружено 673 квартир за 1301 м.с
[18:04:17] [SMSG]: Успешная загрузка ‘LoadMayor’ за 4 м.с
[18:04:17] [GAMENIX MSG]: Успешная загрузка ‘LoadOther’ за 4 м.с
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] [GAMENIX MSG]: Успешная загрузка ‘LoadFrac’ — загружено 20 за 47 м.с
[18:04:17] OnGameModeInit() STK 16280 (4 LOSS)
[18:04:17] ==============================================
[18:04:17] Подключение к базе `G-RP` успешно
[18:04:17] ==============================================
[18:04:17] Number of vehicle models: 49
Достала эта ошибка!!!
sscanf обновил — не помогло!
- 0
Вопросы
Всем привет! Опять встретился с ошибкой sscanf в консоле(
Помогите исправить пожалуйста
Консоль:
Спойлер
———-
Loaded log file: «server_log.txt».
———-
SA-MP Dedicated Server
———————-
v0.3e, (C)2005-2012 SA-MP Team
[20:50:04] weburl = «www.sa-mp.com» (string)
[20:50:04] password = «» (string)
[20:50:04]
[20:50:04] Server Plugins
[20:50:04] —————
[20:50:04] Loading plugin: streamer
[20:50:04]
*** Streamer Plugin v2.6.1 by Incognito loaded ***
[20:50:04] Loaded.
[20:50:04] Loading plugin: sscanf
[20:50:04]
[20:50:04] ===============================
[20:50:04] sscanf plugin loaded.
[20:50:04] (c) 2009 Alex «Y_Less» Cole
[20:50:04] 0.3d-R2 500 Players «dnee»
[20:50:04] ===============================
[20:50:04] Loaded.
[20:50:04] Loading plugin: mysql
[20:50:04]
> MySQL plugin R5 successfully loaded.
[20:50:04] Loaded.
[20:50:04] Loaded 3 plugins.
[20:50:04]
[20:50:04] Filterscripts
[20:50:04] —————
[20:50:04] Loaded 0 filterscripts.
[20:50:04] password = «» (string)
[20:50:04] MySQL: Подключение к базе данных установлено.
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadHouses’ — загружено 0 за 2 м.с
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadBizz’ — загружено 0 за 2 м.с
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadVehicle’ — загружено 22 за 38 м.с
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadEnters’ — загружено 54 пикапов за 39 м.с
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadATM’ — загружено 0 банкоматов за 2 м.с
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadPodezd’ — загружено 0 подьездов за 3 м.с
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadRooms’ — загружено 0 квартир за 2 м.с
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadMayor’ за 3 м.с
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadOther’ за 3 м.с
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadFrac’ — загружено 20 за 24 м.с
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadPromo’ — загружено 0 за 2 м.с
[20:50:04] ==============================================
[20:50:04] Author — Jack_Yermolov Server — Old RolePlay©
[20:50:04] Подключение к базе `rrp2` успешно
[20:50:04] ==============================================
[20:50:04] Number of vehicle models: 40
Возможная строка:
stock LoadOther()
{
new time = GetTickCount();
format(query,sizeof(query), "SELECT * FROM `"TABLE_OTHER"`");
mysql_query(query);
mysql_store_result();
if(mysql_fetch_row(query) == 1)
{
mysql_fetch_row(query);
sscanf(query, "p<|>iiiiiiiiiiiiis[40]iiiiiiiiiiiiiiiiiiiiiiiiiii",
FracBank[0],
FracBank[1],
FracBank[3],
FracBank[4],
FracBank[5],
FracBank[6],
FracBank[7],
FracBank[8],
FracBank[9],
sklads,
ugol,
drev,
ed,
NewsPrice,
Mats[1],//Police
Mats[2],//DPC
Mats[0],///Army
Mats[4],//FSB
Mats[5],//GOP
Mats[6],//LB
Mats[8],//BB
Mats[9],//UGBRATVA
Mineral[0],//mineral
Metal,
Mineral[1],
// FracBank[11],
Mats[16],
Mats[12],
Mats[18],
MafiaMineral[0],
MafiaMineral[1],
MafiaMineral[2],
DrugsBank[F_GOPOTA],
DrugsBank[F_LYTBRATVA],
DrugsBank[F_BATBRATVA],
DrugsBank[F_UGBRATVA],
DrugsBank[F_YAKUZA],
DrugsBank[F_LCN],
DrugsBank[F_RM],
FuelBank,
Plavnya,
TOTALPRIZ);
sscanf(NewsPrice, "p<,>iiiiii",SmsPrice[0], SmsPrice[1], CallPrice[0], CallPrice[1], AdvertPrice[0], AdvertPrice[1]);
}
mysql_free_result();
printf("ARPLOAD: Успешная загрузка 'LoadOther' за %d м.с",GetTickCount() - time);
return true;
}
Поделиться сообщением
Ссылка на сообщение
7 ответов на этот вопрос
- Сортировать по голосам
- Сортировать по дате
- 0
@Zishka, а так:
Спойлер
stock LoadOther() { new time = GetTickCount(); format(query,sizeof(query), "SELECT * FROM `"TABLE_OTHER"`"); mysql_query(query); mysql_store_result(); if(mysql_fetch_row(query) == 1) { mysql_fetch_row(query); sscanf(query, "p<|>iiiiiiiiiiiiis[40]iiiiiiiiiiiiiiiiiiiiiiiiiiii", FracBank[0], FracBank[1], FracBank[3], FracBank[4], FracBank[5], FracBank[6], FracBank[7], FracBank[8], FracBank[9], sklads, ugol, drev, ed, NewsPrice, Mats[1],//Police Mats[2],//DPC Mats[0],///Army Mats[4],//FSB Mats[5],//GOP Mats[6],//LB Mats[8],//BB Mats[9],//UGBRATVA Mineral[0],//mineral Metal, Mineral[1], // FracBank[11], Mats[16], Mats[12], Mats[18], MafiaMineral[0], MafiaMineral[1], MafiaMineral[2], DrugsBank[F_GOPOTA], DrugsBank[F_LYTBRATVA], DrugsBank[F_BATBRATVA], DrugsBank[F_UGBRATVA], DrugsBank[F_YAKUZA], DrugsBank[F_LCN], DrugsBank[F_RM], FuelBank, Plavnya, TOTALPRIZ); sscanf(NewsPrice, "p<,>iiiiii",SmsPrice[0], SmsPrice[1], CallPrice[0], CallPrice[1], AdvertPrice[0], AdvertPrice[1]); } mysql_free_result(); printf("ARPLOAD: Успешная загрузка 'LoadOther' за %d м.с",GetTickCount() - time); return true; }
Поделиться сообщением
Ссылка на сообщение
- 0
Тоже-самое
19 часов назад, odosenok сказал:
@Zishka, а так:
код (закрыть спойлер)
stock LoadOther() { new time = GetTickCount(); format(query,sizeof(query), "SELECT * FROM `"TABLE_OTHER"`"); mysql_query(query); mysql_store_result(); if(mysql_fetch_row(query) == 1) { mysql_fetch_row(query); sscanf(query, "p<|>iiiiiiiiiiiiis[40]iiiiiiiiiiiiiiiiiiiiiiiiiiii", FracBank[0], FracBank[1], FracBank[3], FracBank[4], FracBank[5], FracBank[6], FracBank[7], FracBank[8], FracBank[9], sklads, ugol, drev, ed, NewsPrice, Mats[1],//Police Mats[2],//DPC Mats[0],///Army Mats[4],//FSB Mats[5],//GOP Mats[6],//LB Mats[8],//BB Mats[9],//UGBRATVA Mineral[0],//mineral Metal, Mineral[1], // FracBank[11], Mats[16], Mats[12], Mats[18], MafiaMineral[0], MafiaMineral[1], MafiaMineral[2], DrugsBank[F_GOPOTA], DrugsBank[F_LYTBRATVA], DrugsBank[F_BATBRATVA], DrugsBank[F_UGBRATVA], DrugsBank[F_YAKUZA], DrugsBank[F_LCN], DrugsBank[F_RM], FuelBank, Plavnya, TOTALPRIZ); sscanf(NewsPrice, "p<,>iiiiii",SmsPrice[0], SmsPrice[1], CallPrice[0], CallPrice[1], AdvertPrice[0], AdvertPrice[1]); } mysql_free_result(); printf("ARPLOAD: Успешная загрузка 'LoadOther' за %d м.с",GetTickCount() - time); return true; }
Поделиться сообщением
Ссылка на сообщение
- 0
Так?
Спойлер
stock LoadOther() { new time = GetTickCount(); format(query,sizeof(query), "SELECT * FROM `"TABLE_OTHER"`"); mysql_query(query); mysql_store_result(); if(mysql_fetch_row(query) == 1) { mysql_fetch_row(query); sscanf(query, "p<|>iiiiiiiiiiiiis[128]iiiiiiiiiiiiiiiiiiiiiiiiiii", //41 FracBank[0], FracBank[1], FracBank[3], FracBank[4], FracBank[5], FracBank[6], FracBank[7], FracBank[8], FracBank[9], sklads, ugol, drev, ed, NewsPrice, Mats[1],//Police Mats[2],//DPC Mats[0],///Army Mats[4],//FSB Mats[5],//GOP Mats[6],//LB Mats[8],//BB Mats[9],//UGBRATVA Mineral[0],//mineral Metal, Mineral[1], // FracBank[11], Mats[16], Mats[12], Mats[18], MafiaMineral[0], MafiaMineral[1], MafiaMineral[2], DrugsBank[F_GOPOTA], DrugsBank[F_LYTBRATVA], DrugsBank[F_BATBRATVA], DrugsBank[F_UGBRATVA], DrugsBank[F_YAKUZA], DrugsBank[F_LCN], DrugsBank[F_RM], FuelBank, Plavnya, TOTALPRIZ); sscanf(NewsPrice, "p<,>iiiiii",SmsPrice[0], SmsPrice[1], CallPrice[0], CallPrice[1], AdvertPrice[0], AdvertPrice[1]); } mysql_free_result(); printf("ARPLOAD: Успешная загрузка 'LoadOther' за %d м.с",GetTickCount() - time); return true; }
Отредактировано 18 апреля, 2019 пользователем SCRIPTMAN
Поделиться сообщением
Ссылка на сообщение
- 0
@Zishka Конечно совет — это избавляться от такого рода кода. Лучше сделайте key-value таблицу и будет намного удобней
key | value |
FracBank0 | … |
FracBank1 | … |
Metal | … |
… | … |
Поделиться сообщением
Ссылка на сообщение
- 0
1 час назад, SCRIPTMAN сказал:
Так?
Код (открыть спойлер)
stock LoadOther() { new time = GetTickCount(); format(query,sizeof(query), "SELECT * FROM `"TABLE_OTHER"`"); mysql_query(query); mysql_store_result(); if(mysql_fetch_row(query) == 1) { mysql_fetch_row(query); sscanf(query, "p<|>iiiiiiiiiiiiis[128]iiiiiiiiiiiiiiiiiiiiiiiiiii", //41 FracBank[0], FracBank[1], FracBank[3], FracBank[4], FracBank[5], FracBank[6], FracBank[7], FracBank[8], FracBank[9], sklads, ugol, drev, ed, NewsPrice, Mats[1],//Police Mats[2],//DPC Mats[0],///Army Mats[4],//FSB Mats[5],//GOP Mats[6],//LB Mats[8],//BB Mats[9],//UGBRATVA Mineral[0],//mineral Metal, Mineral[1], // FracBank[11], Mats[16], Mats[12], Mats[18], MafiaMineral[0], MafiaMineral[1], MafiaMineral[2], DrugsBank[F_GOPOTA], DrugsBank[F_LYTBRATVA], DrugsBank[F_BATBRATVA], DrugsBank[F_UGBRATVA], DrugsBank[F_YAKUZA], DrugsBank[F_LCN], DrugsBank[F_RM], FuelBank, Plavnya, TOTALPRIZ); sscanf(NewsPrice, "p<,>iiiiii",SmsPrice[0], SmsPrice[1], CallPrice[0], CallPrice[1], AdvertPrice[0], AdvertPrice[1]); } mysql_free_result(); printf("ARPLOAD: Успешная загрузка 'LoadOther' за %d м.с",GetTickCount() - time); return true; }
Так-же
Поделиться сообщением
Ссылка на сообщение
- 0
А как вообщем sscanf пользоваться? Что за символы
"p<|>iiiiiiiiiiiiis[128]iiiiiiiiiiiiiiiiiiiiiiiiiii"
Поделиться сообщением
Ссылка на сообщение
- 0
@Zishka, порядок типов аргументов. i — целочисленное значение, s[длина] — строковое (массив). p<> — тип разделителя, и в угловых скобках сам разделитель (|).
Поделиться сообщением
Ссылка на сообщение
Эта тема закрыта для публикации ответов.
-
Последние посетители
0 пользователей онлайн
Ни одного зарегистрированного пользователя не просматривает данную страницу
-
Похожий контент
-
От
KAIF
Здравствуйте, подскажите пожалуйста как повысить лимит на загрузку объектов в fastman92limitAdjuster_GTASA
-
Posts: 28
Threads: 4
Joined: Aug 2010
Reputation:
0
Let’s suppose I have this:
pawn Код:
CMD:whisper(playerid, params[])
{
new whisp[90];
if(sscanf(params, "us[90]", giveplayerid, whisp)) return SendClientMessage //Blahblahblah whatever
//Do something here
return 1;
}
Well, it’s a command. So, anybody can use it. Now, if the string text overpass the string size, the sscanf plugin prints this warning: sscanf warning: string buffer overflow.
Now, is there a way to avoid it BEFORE parsing the string with sscanf? Or is it normal to do this warning? I can see that sscanf cuts the string at the point, but are the warnings bad? Or can I just live with it?
Posts: 359
Threads: 63
Joined: Jul 2010
Reputation:
0
I am pretty sure this was fixed in sscanf2, How old is the version of sscanf your using? mine was from 03rd of November 2010, I had downloaded it but forgot to
pawn Код:
#include <sscanf>
to
#include <sscanf2>
up until two days ago. Imagine my face when half my problems instantly disappeared.
Posts: 28
Threads: 4
Joined: Aug 2010
Reputation:
0
Quote:
Originally Posted by Hoborific
I am pretty sure this was fixed in sscanf2, How old is the version of sscanf your using? mine was from 03rd of November 2010, I had downloaded it but forgot to
pawn Код:
#include <sscanf>
to
#include <sscanf2>
up until two days ago. Imagine my face when half my problems instantly disappeared.
Yeah, I use sscanf2.
Posts: 7,801
Threads: 187
Joined: Feb 2010
Reputation:
0
Increase the string size in sscanf for the «whisp» variable, apparently 90 cells isn’t enough!
Posts: 28
Threads: 4
Joined: Aug 2010
Reputation:
0
Quote:
Originally Posted by RealCop228
Increase the string size in sscanf for the «whisp» variable, apparently 90 cells isn’t enough!
Duh, I know that, but as it’s a command, there’s always that MORON who will type dpfamdfsgposdifmbspofvibmxpocvibmxpoifgmspodifmgps odifmgpsodifmg just to fill in the entire space in the chatbox. This will overflow the array. So what? Would the only solution be increasing ALL of my strings’ sizes to 128? I’m definitely not doing that and fucking my stack.
Posts: 7,801
Threads: 187
Joined: Feb 2010
Reputation:
0
Quote:
Originally Posted by hellangel
Duh, I know that, but as it’s a command, there’s always that MORON who will type dpfamdfsgposdifmbspofvibmxpocvibmxpoifgmspodifmgps odifmgpsodifmg just to fill in the entire space in the chatbox. This will overflow the array. So what? Would the only solution be increasing ALL of my strings’ sizes to 128? I’m definitely not doing that and fucking my stack.
Have you ever coded something in a server before? Do you know how often I type messages over 128 characters? I’ll answer that for you- VERY often! The maximum size of any strings sent to the client is 128 cells, you may as well allow people to use them all. Honestly, the main problem is creating a 5000 cell string and really only needing 100 cells of it.
See this for more information: https://sampforum.blast.hk/showthread.php?tid=55261
Posts: 28
Threads: 4
Joined: Aug 2010
Reputation:
0
Quote:
Originally Posted by RealCop228
Have you ever coded something in a server before? Do you know how often I type messages over 128 characters? I’ll answer that for you- VERY often! The maximum size of any strings sent to the client is 128 cells, you may as well allow people to use them all. Honestly, the main problem is creating a 5000 cell string and really only needing 100 cells of it.
See this for more information: https://sampforum.blast.hk/showthread.php?tid=55261
I’ma talking about smaller strings, like an identifier, like «type enter to enter». A string to hold ENTER would need only 6 cells, so why would I make 128 cells for a string that needs only 6? Just to get around the warning?
Posts: 7,801
Threads: 187
Joined: Feb 2010
Reputation:
0
Quote:
Originally Posted by hellangel
I’ma talking about smaller strings, like an identifier, like «type enter to enter». A string to hold ENTER would need only 6 cells, so why would I make 128 cells for a string that needs only 6? Just to get around the warning?
You would just add a check underneath the sscanf line…?
pawn Код:
if(strlen(params) > 6)
return 0;
Posts: 28
Threads: 4
Joined: Aug 2010
Reputation:
0
Here’s what I did originally (Yea yea I used godfather, moving on..)
pawn Код:
new x_nr[16];
if(sscanf(params, "s[16] ", x_nr))
{
SendClientMessage(playerid, COLOR_YELLOW2, "USO: /irc [Nome]");
SendClientMessage(playerid, COLOR_YELLOW2, "Nomes disponнveis: Entrar, MOTD, Senha, Precisasenha, Trancar, Kick, Status");
return 1;
}
if(strlen(x_nr)) > 16) return SendClientMessage("blahblahblah");
Posts: 6,129
Threads: 36
Joined: Jan 2009
It’s a warning to you as a scripter to increase the size of your string, as it truncates the text. It’s nothing you should consider serious really, as it manages the buffer overflow itself, it just warns you that it had to.