shape1
shape2
shape3
shape4
shape7
shape8

Функции strtok, strval, strlen.


Статус
Закрыто для дальнейших ответов.

ac1nve

Продвинутый
Пользователь
23.02.2016
591
231
0
Здравствуйте, в данной статье Вы узнаете про функции: strval, strtok , strlen.

strtok[/B]]strtok - это функция, используется чтобы определить пробел между командой и параметром. Вам кажется сложным отличать параметры от команды? Этот урок должен вам помочь.

strlen[/B]]strlen - функция, которая возвращает длину строки.

strval[/B]]strval - функция, которая приводит строковый тип в численный, если в строке число.

Вот вам наглядный пример этих функций с объяснениями:

public OnPlayerCommandText(playerid, cmdtext[])
{
new tmp[255], string[255], cmd[255], idx, giveplayerid, sendername, giveplayer;
cmd = strtok(cmdtext, idx);
GetPlayerName(playerid, sendername, sizeof(sendername));
if(strcmp(cmd, "/akill", true) == 0)
{
if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0x919191FF, "Вы должны быть администратором чтобы использовать эту команду.");
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid, 0x919191FF, "Использование: \"/akill [ID]\"");
giveplayerid = strval(tmp);
GetPlayerName(giveplayerid, giveplayer, sizeof(giveplayer));
if(!IsPlayerConnected(giveplayerid))SendClientMessage(playerid, 0x919191FF, "Игрок с данным ID не подключён.");
SetPlayerHealth(giveplayerid, 0.0);
return 1;
}
}

Объяснение:

giveplayerid = strval(tmp);

Присвоение переменной "giveplayerid"к числовому значение "tmp".(tmp обычная переменная можно другую)  

if(!strlen(tmp)) return SendClientMessage(...);

Если "giveplayeridне был указан (То есть было написано /akill вместо /akill ID)(Создайте переменную и все)

Автор статьи: Игорь19998

Автор переработки статьи: jo1ny
 
Последнее редактирование модератором:

noname_idk

Гуру
Пользователь
19.07.2015
4 046
7
787
0
Скриптер
Немного от себя бы к strval добавил про floatstr...

В общем эта функция из строки выделяет нецелое число. Ну, например, вводим дробь в диалоговое окно:

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case 1:
{
if(!response) return true;
if(!strlen(inputtext)) return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Ввод дроби", "Введите необходимое число с плавающей точкой.", "Готово", "Закрыть");
new Float:argument = floatstr(inputtext);
printf("В диалоге 1 введено число %f", argument);
}
}
return false;
}

Либо при получении данных из базы данных:

new argument[10];
cache_get_field_content(0, "pos_x", argument), VehicleInfo[vehicleid][fX] = floatstr(argument);

Пример второй не самый удачный, наверное, лучше было бы создать одну переменную, в которую хранить всю позицию. Кстати, вместо strtok еще предлагаю использовать sscanf. Его суть в принципе та же. Но все несколько проще. Например, записана позиция автомобиля в переменную string (объявленную как new string[24]): "-335.6699,1337.6289,12.7276". Для того чтобы получить каждый параметр в отдельности, используем sscanf:

sscanf(string, "p<,>fff", x, y, z);

string - откуда извлекаем, p<> - разделение между параметрами (если пробелы, то эта часть не нужна, если какие-то иные знаки, например, запятая, слэш, точка с запятой, то используем его).

x, y, z - в какие переменные записано все.

 
Статус
Закрыто для дальнейших ответов.