Вход

Просмотр полной версии : [Вопрос] Работа со sscanf2. Неопциональные параметры



Elrmrnt-Kritik
09.03.2018, 23:12
Здравствуйте. Хотел немножко уточнить, вот есть такой код:


if(sscanf(params, "uD(5)S(Не указано)[32]", params[0], params[1], params))

(взял его на этом форуме в другой теме)

Я так понял здесь D (integer) и S (string) - неопциональные параметры. А что означает (5) и что за (Не указано)? Это сколько пропускать? Если да, то возможно ли не указывать длину пропускаемую для S?

И возможно ли аналогично использовать необязательные параметры для вещественных типов, например, F? Не видел примера с ним.

Также встретился еще с таким более страшным кодом :dash2:


sscanf(params, "I(-1)is[32]", targetid, mute_time, reason)


Судя по контенту в интернете, I - игнорирование параметров. Но я не совсем разобрался как им пользоваться...

DeimoS
10.03.2018, 00:17
В скобках после больших букв указывается то, какое значение устанавливать для переменной в случае, если в строке не найдено значение для спецификатора.
То бишь, в этом примере

if(sscanf(params, "uD(5)S(Не указано)[32]", params[0], params[1], params))
Если указать только ID игрока (первый параметр), то в "params[1]" попадёт число "5", а в "params" строка "Не указано".
Хотя пример, на самом деле, не рабочий, ибо строка перезапишет ID игрока и второй параметр (params[0] и params[1])

Во втором случае то же самое, только вместо 5 будет стоять -1. А "i"/"I" - это то же самое, что и "d"/"D" (в Pawn, по крайней мере) - то есть, целочисленный спецификатор.


Все доступные спецификаторы можно найти в теме на официальном форуме. Собственно, вот он:

Format Use
L(true/false) Optional logical truthity
l Logical truthity
K<callback>(any format number) Optional custom operator
k<callback> Custom operator
B(binary) Optional binary number
b Binary number
N(any format number) Optional number
n Number
C(character) Optional character
c Character
I(integer) Optional integer
i Integer
D(integer) Optional integer
d Integer
H(hex value) Optional hex number
h Hex number
O(octal value) Optional octal value
o Octal value
F(float) Optional floating point number
f Floating point number
G(float/INFINITY/-INFINITY/NAN/NAN_E) Optional float with IEEE definitions
g Float with IEEE definitions
{ Open quiet section
} Close quiet section
P<delimiters> Multiple delimiters change
p<delimiter> Delimiter change
Z(string)[length] Invalid optional string
z(string)[length] Deprecated optional string
S(string)[length] Optional string
s[length] String
U(any format number) Optional user (bot/player)
u User (bot/player)
Q(any format number) Optional bot (bot)
q Bot (bot)
R(any format number) Optional player (player)
r Player (player)
A<type>(default)[length] Optional array of given type
a<type>[length] Array of given type
E<specification>(default) Optional enumeration of given layout
e<specification> Enumeration of given layout
'string' Search string
% Deprecated optional specifier prefix
? Local options specifier
Тут же написано, что для указания необязательного спецификатора для вещественного числа нужно использовать "F(значение)".


И да, если не нужно никакое значение заносить в переменную в случае, если параметр в команде не указан, то просто оставляешь скобки пустыми

Elrmrnt-Kritik
10.03.2018, 00:31
Тут же написано

Честно говоря, не видел это добро. Как-то вот под sscanf нет толковых уроков, как, например, про регулярные выражения. А так разобрался, спасибо большое))

DeimoS
10.03.2018, 00:35
Так а что может быть более толковое, чем статья на официальном сайте (http://forum.sa-mp.com/showthread.php?t=602923)? :)
Если плохо с английским, гугл-переводчик может спасти ситуацию. А там, где даже гугл-переводчик выдаёт что-то непонятное, всегда на помощь может прийти метод научного тыка