Using strcmp() RU

From SA-MP Wiki

Jump to: navigation, search

Использование 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;
}
Personal tools
Navigation
Toolbox
In other languages