Using strcmp() RU
From SA-MP Wiki
Использование strcmp()
Использование strcmp() и strtok() в OnPlayerCommandText для создания собственных команд
Откройте Pawno, File > New.
Делаем команду /me
Если Вы хотите прочитать о делении строки по пробелам с применением strtok, читайте нижний раздел.
public OnPlayerCommandText(playerid, cmdtext[]) { if(!strcmp(cmdtext, "/me", true, 3)) // сравниваем только первые три символа { //Если третий символ (отсчет идет с нуля, НЕ единицы) отсутствует, возвращаем функцию и отправляем игроку сообщение с примером правильного применения: if(!cmdtext[3])return SendClientMessage(playerid, 0xFF0000FF, "USAGE: /me [action]"); new str[128]; GetPlayerName(playerid, str, sizeof(str)); //Форматируем str: ник игрока и далее введенный текст команды, начиная с четвертого символа (отсчет с 0, напоминаю): format(str, sizeof(str), "* %s %s", str, cmdtext[4]); SendClientMessageToAll(0xFFFF00AA, str); return 1; } return 0; }
Теперь, если мы введем команду '/me blabla' , в чате появится сообщение вида "* Nick blabla". На заметку: в этом коде после '/me' можно не ставить пробел, а написать абсолютно любой символ (здесь происходит проверка только на наличие четвертого символа, о том, чему он равен, ничего не сказано). Т.е. если мы введем команду '/meAHello', в чате появится сообщение вида "* Nick Hello".
Использование strtok()
strtok возвращает строку, которая вышла при "отделении" пробелом в указанной строке. В частых случаях используется для "изъятия" параметров из команды . Например: /freeze PlayerID или /givecash PlayerID Money. В первом примере сделаем команду /sayhello PlayerID, при которой игроку с указанным ID отправляется сообщение "Hi, Hello!".
Но для начала мы возьмем пример попроще, чтобы в полной мере выяснить, как он работает. Будем разбирать на примере строки, содержащей текст, хмм, предположим: "I want to create my gamemod!".
new text[30]; //наш массив, который будет использоваться в качестве строки new idx = 0; //Эта переменная нам понадобиться для функции strtok, она будет хранить число, которое будет указывать, какое по счету слово нам нужно "вырезать" из строки new word[15]; //а этот массив будет использоваться в качестве строки, в которую будут записываться "вырезанные слова" из текста. //Собственно, заполняем строку нашей фразой format(text, sizeof(text), "I want to create my gamemod!"); //Предположим, мы хотим вытащить второе слово. Не забывайте, что в программирование отсчет начинается с нуля, поэтому нам нужно указать, что нам нужно "первое", а не нулевое слово: idx = 1 word = strtok(text,idx); //Вы можете запросто проверить этот код, не заходя в геймплей игры в консоли, в данный момент строка "word" содержит слово "want". //Если Вы повторите последнюю строку кода, то строка "word" будет содержать уже следующее слово из фразы, т.к. strtok после использование '''всегда прибавляет единицу ко второму аргументу''', в данном случае к переменной idx. word = strtok(text,idx); //Так что, сейчас строка "word" содержит слово "to"
Ну и, естественно, пример частого использования функции strtok - для изъятия аргументов, указываемых игроками. Здесь мы назовем разделение строки не по словам, а по параметрам, как это принято:
public OnPlayerCommandText(playerid, cmdtext[]) { new cmd[30]; //переменная будет содержать первый параметр (/sayhello) new idx; //переменная будет хранить, какой по-счету параметр записан cmd = strtok(cmdtext, idx); //заполняем строку cmd первым (нулевым, считая по idx = 0) параметром. if(strcmp(cmd, "/sayhello", true) == 0) //Если cmd равна '/sayhello': { new tmp[30]; // заполняем строку tmp вторым (первым, считая по idx = 1) параметром: tmp = strtok(cmdtext, idx); // конвертируем строку tmp в целое число new otherplayer = strval(tmp); if(IsPlayerConnected(otherplayer)) { SendClientMessage(otherplayer, 0xFFFF00AA, "Hi, hello!"); } return 1; } return 0; }