shape1
shape2
shape3
shape4
shape7
shape8

Использование extract в sscanf 2.8.1


JoKeR2020

Гуру
Пользователь
26.11.2014
1 800
4
321
0
Всем привет!

На днях я столкнулся с интересным способом работы с sscanf без вызова функции sscanf().

Наткнулся я на неё случайно когда листал другой форум.

Подробно о ней я узнал на оф. форуме SAMP.

Для начала приведу простой пример команды на DC_CMD с использованием extract

Допустим у нас есть такая команда:

CMD:say(playerid, params[])
{
if(sscanf(params,"s[100]", params[1])) return SendClientMessage(playerid, -1, "USAGE: /say [text]");
new cmdstr[100];
format(cmdstr, sizeof(cmdstr), "* Admin: %s", params[1]);
SendClientMessageToAll(-1, cmdstr);
return 1;
}

Как видно здесь я использую обычный sscanf.

А теперь другой формат данной команды через extract:

CMD:say(playerid, params[])
{
extract params -> new string:text[100]; else
{
return SendClientMessage(playerid, -1, "USAGE: /say [text]");
}
new str[100];
format(str, sizeof(str), "* Admin: %s", text);
SendClientMessageToAll(-1, str);
return 1;
}

Как мы видим, перед нами появилась скорее вам не понятная конструкция.

Однако это действительно работает.

extract <var1> -> new <vars>; else
{
<код если не соответствует>

<var1> - переменная которую нужно парсить.

Чтобы было наглядно:

Это та же первая переменная которую мы указываем в функции sscanf.

<vars> - это переменные в которые нужно записать значения.

<код если не соответствует> - это тот же return в обычной нам функции sscanf.

Здесь вы можете разместить любой код, который будет выполняться если значения в var1 не соответствуют заданным в vars.

Если вы хотите в парсинге использовать другой разделитель, а не пробел, то после var1 вы должны вставить вот это:

<разделитель>
Разделитель это и есть то самое значение которое вы должны заменить на своё.

Пример:

extract params<|> -> new <vars>; else
{
<код если не соответствует>

Таким образом мы скажем sscanf'у что хотим использовать символ | как разделитель.

Переменные в <vars> создаются через обычный new.

Но перед переменной должна присутствовать приставка (кроме целочисленных переменных, для них приставка не нужна).

Например создание трёх переменных (a, b, c):

extract params -> new a, string:b[100], Float:c; else
{
<код если не соответствует>

Теперь разберём какие же типы переменных мы указали.

Переменная a - данную переменную sscanf будет использовать как целочисленное (пример: 5).

Переменная b - данная переменная имеет приставку string, что даёт ей тип строки, в квадратных скобках обязательно нужно указать размер строки, как и в обычном new (пример: Привет).

Переменная c - данная переменная имеет приставку Float, что даёт ей вещественный тип (пример: 0.5).
Некоторые типы переменных которые поддерживает extract:

  • без приставки - целочисленный тип (пример: 1)
  • приставка string - строковой тип (пример: Привет)
  • приставка Float - вещественный тип (пример: 1.60)
  • приставка player - аналог символу u (пример: Joker_Villen или его id: 1)
  • приставка hex - бинарное число (пример: 0xFF)
Это все типы которые мне удалось раздобыть в той теме на оф. форуме SAMP.

extract поддерживает создание переменных которые не обязательно должны присутствовать в строке для парсинга.

Объявлять данные переменные нужно как и обычные, но указывать значения прямо в new:

extract params -> new a, string:b[100] = "Если данный параметр не указан, он будет равняться этому", Float:c = 0.5; else
{
<код если не соответствует>

Таким образом если в исходной строке для парсинга будет отсутствовать строковой параметр, он будет равняться значением которое мы указали.

Я смог рассказать всё что понял со своим знанием английского из той темы и описал это здесь.
 

Mirex

Руководитель проекта
Команда портала
Гл.Администратор
Золотой
21.12.2013
2 512
3
550
0
29
definehost.ru
Скриптер
Спасибо, вычитал для себя полезную информацию.

 

LHTTD

Темная сторона Форума
Пользователь
08.10.2014
325
43
0
Мне кажется, или  с обычной функцией sscanf лучше как и в использовании так и в понятии

 
Последнее редактирование модератором:

LHTTD

Темная сторона Форума
Пользователь
08.10.2014
325
43
0
Не знаю, честно мне удобнее так. Как то привычней. Я же ещё с PHP работаю одновременно (сайт пишу).
Ясно, просто я учился по стандартному методу и переучить меня не возможно, самоучка :D

 

Anton_Styazhkin

Новичок
Пользователь
06.01.2016
20
6
0
26
Возьмите два файла и создайте две одинаковых команды, потом скомпилируйте оба скрипта с ключом -a и сравните листинги. Где меньше операций -лучше.