Всем привет!
На днях я столкнулся с интересным способом работы с 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;
}
Как мы видим, перед нами появилась скорее вам не понятная конструкция.
Однако это действительно работает.
На днях я столкнулся с интересным способом работы с 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> - переменная которую нужно парсить.
Чтобы было наглядно:
Это та же первая переменная которую мы указываем в функции sscanf.
<vars> - это переменные в которые нужно записать значения.
<код если не соответствует> - это тот же return в обычной нам функции sscanf.
Здесь вы можете разместить любой код, который будет выполняться если значения в var1 не соответствуют заданным в vars.
Если вы хотите в парсинге использовать другой разделитель, а не пробел, то после var1 вы должны вставить вот это:
<разделитель>
Разделитель это и есть то самое значение которое вы должны заменить на своё.
Пример:
extract params<|> -> new <vars>; else
{
<код если не соответствует>
}
Таким образом мы скажем sscanf'у что хотим использовать символ | как разделитель.
<разделитель>
Разделитель это и есть то самое значение которое вы должны заменить на своё.
Пример:
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).
Но перед переменной должна присутствовать приставка (кроме целочисленных переменных, для них приставка не нужна).
Например создание трёх переменных (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)
extract поддерживает создание переменных которые не обязательно должны присутствовать в строке для парсинга.
Объявлять данные переменные нужно как и обычные, но указывать значения прямо в new:
extract params -> new a, string:b[100] = "Если данный параметр не указан, он будет равняться этому", Float:c = 0.5; else
{
<код если не соответствует>
}
Таким образом если в исходной строке для парсинга будет отсутствовать строковой параметр, он будет равняться значением которое мы указали.
Я смог рассказать всё что понял со своим знанием английского из той темы и описал это здесь.
Объявлять данные переменные нужно как и обычные, но указывать значения прямо в new:
extract params -> new a, string:b[100] = "Если данный параметр не указан, он будет равняться этому", Float:c = 0.5; else
{
<код если не соответствует>
}
Таким образом если в исходной строке для парсинга будет отсутствовать строковой параметр, он будет равняться значением которое мы указали.
Я смог рассказать всё что понял со своим знанием английского из той темы и описал это здесь.