Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!: sscanf - Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!

Перейти к содержимому

  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

sscanf v2.8.2 Оценка: -----

#1
Пользователь офлайн   Pa4enka 

  • Эксперт
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
SSCANF 2.8.2

Автор: Y_LESS
Перевод: Pa4enka


Для подключения плагина достаточно добавить эту строку в мод (прим. после a_samp) :
#include < sscanf2 >

Что бы установить/заменить плагин выполните следующее:
• Поместите файлы с расширениям .dll [Windows], .so[Linux] в папку plugins, а .inc в pawno/include;

• В server.cfg пропишите следующее:
plugins sscanf


Основной код выглядит следующим образом:
if (sscanf(params, "ui", giveplayerid, amount))
return SendClientMessage(playerid, 0xFF0000AA, !"Используй: /givecash <playerid> <кол-во>");


Вместе с тем следует отметить, что sscanf может быть использован для любой обработки текста. Например ini-процессор может выглядеть следующим образом:
if(sscanf(szFileLine, "p<=>s[8]s[32]", szIniName, szIniValue))
print(!"Invalid INI format line");

Существует также альтернативное имя функции, чтобы избежать путаницы со стандартным sscanf:
if (unformat(params, "ui", giveplayerid, amount))
return SendClientMessage(playerid, 0xFF0000AA, !"Используй: /givecash <playerid> <кол-во>");


СПЕЦИФИКАТОРЫ

1. Базовые


Скриншот [Показать]


2. Строки


Спецификатор "s" используется, как и раньше, для строк - но теперь они более продвинутые.
sscanf("hello 27", "si", str, val);

Результат : hello и 27

Используем:
sscanf("hello there 27", "si", str, val);

Результат: неудача т.к «there» не целое число.

Используем:
sscanf("hello there", "s", str);

Результат: hello there

Используем:
sscanf("hello there", "s ", str);
// прим.: после s пробел

Результат: hello

Вы также можете избежать части строки с "\\" - обратите внимание, что два обратных слэша, как 1 используется компилятором:
sscanf("hello\\ there 27", "si", str, val);

Результат:
hello there
27


Все эти примеры, будут давать предупреждения на сервере, так как новая версия имеет размеры массива. Приведенный выше код должен выглядеть так:
new
    	str[32],
    	val;
sscanf("hello\\ there 27", "s[32]i", str, val);


Как вы можете видеть - спецификатор формата теперь содержит длину целевой строки.

Примечания: спецификатор «z» удален, что бы реализовать новую систему, ниже.

3. Массивы


new
    	arr[5];
sscanf("1 2 3 4 5", "a<i>[5]", arr);

"a" спецификатор сразу же следует одному типу в угловых скобках - этот тип может быть любым из основных типов, перечисленных выше. Приведенный выше код будет ставить цифры от 1 до 5 в 5 индексов "arr" переменной массива.

Массивы могут также теперь быть объединены со строками (смотри ниже), указав размер строки в тип массива:
a<s[10]>[12]

Это даст массив из 12 строк, каждая длиной до 10 символов (9 + NULL).

4. Энум [прим. Enum]


Это, возможно, наиболее мощное дополнением к sscanf. Обновления дает возможность определить структуру перечисления в пределах спецификатора строки и считывать любые данные прямо в него.
enum
   	 E_DATA
{
    	E_DATA_C,
    	Float:E_DATA_X,
    	E_DATA_NAME[32],
    	E_DATA_Z
}

main
{
    	new
        	var[E_DATA];
    	sscanf("1 12.0 Bob c", "e<ifs[32]c>", var);
}

Я буду поражен, если вы можете прочитать этот код сразу, поэтому я объясню «это» медленно (прим. Есть такие?? ;D):
е - начало  "перечислений"
<- Запуск спецификации структуры перечислении
i - Целое число, соответствует E_DATA_C
f - Float, соответствует E_DATA_X
s [32] - строка 32 ячейки, соответствует E_DATA_NAME
c - символ, соответствует E_DATA_Z
> - Конец спецификации перечислений

Обратите внимание, что перечисление не требует размер как массивы и строки - ее размер определяется количеством и размером типов. Большинство, но не все, спецификаторы могут быть использованы внутри перечислений (в частности, массивов).

5. Queit


Два новых спецификаторов "{" и "}". Это строки, которые считываются и проверяются, но не сохраняются. Например:
sscanf("42 -100", "{i}i", var);

Очевидно, что есть два числа и два "i", но только одна переменная возврата. Это происходит потому, что первый “i" не сохраняется, но влияет на возвращаемое значение. Приведенный выше код делает "var" -100". Приведенный ниже код потерпит неудачу, если в проверке:
sscanf("hi -100", "{i}i", var);

Можно также встроить спецификаторы внутри спецификации перечислений:
sscanf("1 12.0 Bob 42 INFINITY c", "e<ifs[32]{ig}c>", var);

Queit не может содержать другие тихие спецификаторы, тем не менее, они могут включать в себя перечислений, которые содержат спецификаторы.

6. Поисковые запросы


Поисковые запросы были и в последней версии sscanf тоже, но я все равно буду объяснять их снова. Строки, заключенные в одиночные кавычки (') проверяются на наличие в основной строке:
sscanf("10 11 woo 12", "i'woo'i", var0, var1);


Результат:
10
	12


Вы можете достичь того же эффекта с:
sscanf("10 11 woo 12", "i{is[1000]}i", var0, var1);


7. Энум [прим. x2]


e<ii-i-ii>

Здесь "-" это "минус", и говорит sscanf, что существует элемент перечислимого типа есть, но ничего не делать, так что если у вас:
enum E
{
    	E_A,
    	E_B,
    	E_C,
    	E_D,
    	E_E
}

И вы только хотел обновить первые два и последние поля и оставить все остальные нетронутыми вы могли бы использовать этот спецификатор.

8. Разделители


В предыдущей версии была эта функция. Но сейчас она изменила свой синтаксис. Раньше было:
sscanf("1,2,3", "p,iii", var0, var1, var2);

Сейчас:
sscanf("1,2,3", "p<,>iii", var0, var1, var2);

Старые разделители будут доступны, но это даст предупреждения.

9. Необязательные спецификаторы


КАЖДЫЙ спецификатор формата (то есть, все, за исключением ''{} и р) теперь имеет дополнительный эквивалент - это лишь их заглавной буквы, так, например, старый "r" необязательная строка спецификатор теперь "S" (есть еще "r" и, для полноты картины, "Z", но оба дают предупреждения). В дополнение к необязательных спецификаторов, есть также значения по умолчанию:
sscanf("", "I(12)", var);

В "()" s (круглые скобки) содержат значения по умолчанию для дополнительного целого числа и, как основная строка не содержит никаких данных, значение "вар" становится "12".

10. Пользователи («Users»)


"u", "q" и "R" спецификаторы поиска пользователя по имени или ID. Метод этого поиска изменился в последних версиях "sscanf".
Кроме того, "U", "Q" и "R", могут взять имя или идентификатор в качестве значения по, и sscanf не будет пытаться определить, является ли этот ID online.

Раньше:
sscanf(params, "U(Y_Less)", id);
if (id == INVALID_PLAYER_ID)
{
     // Y_Less или введенный игрок не подключен.
}


Сейчас:
sscanf(params, "U(-1)", id);
if (id == -1)
{
    		// Ни один игрок не был введен.
}
else if (id == INVALID_PLAYER_ID)
{
    		// Введенный игрок не подключен.
}


Теперь пользователи могут при необходимости возвращать массив пользователей, а не только один. Этот массив представляет собой список совпадающих идентификаторов, а затем "INVALID_PLAYER_ID". Принимая во внимание следующих игроков:
Ники игроков [Показать]


Код:
new ids[3], i;
if (sscanf("Le", "?<MATCH_NAME_PARTIAL=1>u[3]", ids)) print("Ошибка");
for (i = 0; ids[i] != INVALID_PLAYER_ID; ++i)
{
    if (ids[i] == cellmin)
    {
        print("Слишком много совпадений");
        break;
    }
    printf("id = %d", ids[i]);
}
if (i == 0) print("Совпадений не найдено")


Выведет:
id = 0
id = 1
Слишком много совпадений

Ищем «Les», получим:
id = 0 ; id = 1

И поиск без использования "MATCH_NAME_PARTIAL" даст:
Совпадений не найдено


11. Пользовательские спецификаторы


Последняя версия sscanf добавляет новый "К" спецификатор, чтобы позволить вам определить свои собственные спецификаторы в PAWN:
SSCANF:playerstate(string[])
{
    if ('0' <= string[0] <= '9')
    {
        new
        ret = strval(string);
        if (0 <= ret <= 9)
        {
            	return ret;
        }
    }
    else if (!strcmp(string, "PLAYER_STATE_NONE")) return 0;
    else if (!strcmp(string, "PLAYER_STATE_ONFOOT")) return 1;
    else if (!strcmp(string, "PLAYER_STATE_DRIVER")) return 2;
    else if (!strcmp(string, "PLAYER_STATE_PASSENGER")) return 3;
    else if (!strcmp(string, "PLAYER_STATE_WASTED")) return 7;
    else if (!strcmp(string, "PLAYER_STATE_SPAWNED")) return 8;
    else if (!strcmp(string, "PLAYER_STATE_SPECTATING")) return 9;
}


Код выше добавит "playerstate" спецификатор, что позволяет сделать следующее:
sscanf(params, "uk<playerstate>", playerid, state);

Эта система поддерживает дополнительные пользовательские спецификаторы без дополнительного кода PAWN:
sscanf(params, "uK<playerstate>(PLAYER_STATE_NONE)", playerid, state);


ОПЦИИ

Последняя версия sscanf вводит несколько опций, которые могут быть использованы для настройки способа, в котором sscanf работает.
Предусмотрены следующие опции:

1. OLD_DEFAULT_NAME:


Поведение "U", "Q" и "R" были изменены, чтобы принять любое количество по умолчанию, вместо подключенного игрока.

2. MATCH_NAME_PARTIAL:


В настоящее время sscanf будет искать игроков по имени, и будет ВСЕГДА искать для игрока, имя которого начинается с указанной строки. Если у вас есть, скажем, "[CLAN] Y_Less", и кто-то типа "Y_Less", sscanf не найдет "[CLAN] Y_Less", потому что имя не начинается с указанным именем. Этот параметр, когда установлен 1 будет искать где-нибудь в имени игрока.

3. CELLMIN_ON_MATCHES:

Вне зависимости от значения "MATCH_NAME_PARTIAL", первый найденный игрок всегда будет показан, так что если вы делаете поиск для "_" на сервере RP, вы можете получить практически любого человека. Для того, чтобы обнатужить более чем одного игрока, то sscanf возвращает идентификатор "cellmin":
sscanf(params, "?<CELLMIN_ON_MATCHES=1>U(-1)", id);
if (id == -1)
{
        // ничего не ввели
}
else if (id == cellmin)
{
       // найдено несколько игроков
}
else if (id == INVALID_PLAYER_ID)
{
       // Игрок не подключен
}
else
{
        // Найден 1(!) игрок
}


4. SSCANF_QUIET:

Не выводить какие-либо ошибки на консоль. На самом деле не рекомендуется, если вы не знаете, что ваш код является стабильным.

ОШИБКИ И ПРЕДУПРЕЖДЕНИЯ

1. sscanf error: System not initialised


Если вы получаете эту ошибку, вам необходимо убедиться, что вы перекомпилировали все ваши скрипты, используя последнюю версию "sscanf2.inc"

2. sscanf warning: String buffer overflow.


Эта ошибка появляется, когда люди пытаются и положить слишком много данных в строку. Например:
new str[10];
sscanf("Hello there, how are you?", "s[10]", str);

Этот код будет пытаться поместить строку "Привет, как ты?" в переменную под названием "str". Тем не менее, в "str"может вместиться только 10 символов(+ NULL). В этом случае остальные данные игнорируются:
new str[10], num;
sscanf("Hello there you|42", "p<|>s[10]i", str, num);


3. sscanf error: Multi-dimensional arrays are not supported.


Не правильно:
sscanf(params, "a<a<i>[5]>[10]", arr);

Правильно:
sscanf(params, "a<i>[50]", arr[0]);


4. sscanf error: Delimiters are not supported in arrays.


Это:
a<p<,>i>[10]

Замените на это:
p<,>a<i>[10]


5.sscanf error: Quiet sections are not supported in arrays.


a<{i}>[10]

Замените на это:
{a<i>[10]}


6. sscanf error: Unknown format specifier '?'.


Неизвестный спецификатор

7. sscanf warning: 'Z' doesn't exist - that would be an optional, deprecated optional string!.


Вы использовали "Z", вместо того, чтобы использовать "S".

8. sscanf warning: Empty default values.


Необязательный спецификатор, который установлен как (например):
I()

Вместо:
I(42)


9. sscanf warning: Unclosed default value.


Ошибка возникает при не правильному использованию спецификатора(например):
I(42

Замените на:
I(42)


10. sscanf warning: No default value found.


Было:
I()

Замените на:
I(42)


11. sscanf warning: Unenclosed specifier parameters are deprecated, consider using something like p<<>.


Скорее всего вы используете старый стиль оформления массивов. Решаеться заменой p, на p<,>

12. sscanf warning: Arrays without a length are deprecated, please add a destination size.


Было: s, стало s[10]

13. sscanf error: SSCANF_Init has incorrect parameters.
14. sscanf error: SSCANF_Join has incorrect parameters.
15. sscanf error: SSCANF_Leave has incorrect parameters.
16. sscanf error: SSCANF_SetPlayerName has incorrect parameters.


Обновите sscanf2.




ВАЖНО:
3 дня 20 минут - потрачено на перевод статьи;
7 страниц – занимает статья в Word;

Специально для Pawn-Wiki.Ru!

Распространение без разрешения автора строго запрещено!


Оригинал | Автор: Emmet_
extract | Автор: m1n1vv

Прикрепленные файлы


Сообщение отредактировал Pa4enka: 14 Январь 2017 - 18:28

5

#2
Пользователь офлайн   Romzes 

  • © Pawn-Wiki.Ru
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
1. Почему ссылки на скачивание нету? PS: Я добавил.
2. Почему нельзя было таблицу оформить на форуме, довольно красивей будет выглядеть нежели скриншот.

По теме: Все очень классно, молодец что потрудился и перевел. +
0

Сказали спасибо 1:

#3
Пользователь офлайн   Pa4enka 

  • Эксперт
  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Просмотр сообщенияRomzes (18 Декабрь 2016 - 18:42) писал:

1. Почему ссылки на скачивание нету? PS: Я добавил.
2. Почему нельзя было таблицу оформить на форуме, довольно красивей будет выглядеть нежели скриншот.

По теме: Все очень классно, молодец что потрудился и перевел. +

Хотел, но пришлось отойти. С таблицей не разобрался.

На днях дополню новой информацией.

UPD: добавил полезные ссылки

Сообщение отредактировал Pa4enka: 18 Декабрь 2016 - 19:58

0

#4
Пользователь офлайн   Pa4enka 

  • Эксперт
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Добавлен пункт ошибки и предупреждения.

Сообщение отредактировал Pa4enka: 19 Декабрь 2016 - 17:31

0

#5
Пользователь офлайн   NOOBinator 

  • Новичок
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Инклуд не рабочий. (RunTime Error 19)
0

#6
Пользователь офлайн   .s2s.k 

  • Знаток
  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Просмотр сообщенияNOOBinator (04 Январь 2017 - 16:52) писал:

Инклуд не рабочий. (RunTime Error 19)


Да нууууууууууууу
0

#7
Пользователь офлайн   Pa4enka 

  • Эксперт
  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Просмотр сообщенияNOOBinator (04 Январь 2017 - 16:52) писал:

Инклуд не рабочий. (RunTime Error 19)

Все работает. Перепроверил.

Сообщение отредактировал Pa4enka: 04 Январь 2017 - 17:19

0

#8
Пользователь офлайн   Const 

  • Знаток
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
У тебя пару ошибок увидел в конце.
1) Не "extact", а "extract";
2) Не "Распространения", а "Распространение", так грамотней :happy:

Изображение
0

Сказали спасибо 1:

#9
Пользователь офлайн   Romzes 

  • © Pawn-Wiki.Ru
  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Просмотр сообщенияNOOBinator (04 Январь 2017 - 16:52) писал:

Инклуд не рабочий. (RunTime Error 19)


Может быть вы используете инклуд без установленного плагина?
0

#10
Пользователь офлайн   NOOBinator 

  • Новичок
  • Вставить ник
  • Цитировать
  • Раскрыть информацию

Просмотр сообщенияRomzes (04 Январь 2017 - 21:08) писал:

Может быть вы используете инклуд без установленного плагина?

Нет, всё, как полагается.
0

Поделиться темой:


  • (2 Страниц) +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей