Всем привет. У меня такой вопрос. Как многие знают, я занимаюсь модом Funny RP. Так вот, как написал Daniel_Cortez:
Ну вот попробовал наконец добавить команду с использованием sscanf и у меня в консоли выбило:Сам собой напрашивается вопрос: зачем вообще к моду подключен 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 ничего нет, то команды будут работать не так, как задумано.
Ну как я понял, переполнение буфера. Но Daniel_Cortez сказал, что sscanf подключен к моду не правильно, по этому будут такие ошибки.PHP код:
sscanf warning: String buffer overflow.
Так как же правильно подключить 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);
Если тут написать текст больше 50, то в консоли выбивает про буфер. Я пробовал изменять на 128 и т.д., но все равно, если больше напишешь символов, то будет снова это сообщение. P.S. используется sscanf 2.8.1PHP код:
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;
}