Введение. Основная информация.
Доброе время суток, участники форума. Достаточно часто пользуюсь функцией sscanf. Почему? Она удобна и практична. Причем использовать ее можно не только в командах, но и, например, при загрузке чего-либо из базы данных, как это делаю я. Допустим, есть система автомобилей. Дабы не создавать два столбца для каждого из двух возможных цветов транспортного средства, можно создать один, в который записывать значение вида "цвет_1, цвет_2". Записать-то запишем, через format:
Но вот получить из этой строки два значения уже будет проблематично. Приходит нам на помощь sscanf2.
Скачать sscanf2. Все инструкции по подключению изложены в той же теме.
Итак, функция имеет следующие аргументы:
По поводу разделителей. Собственно, это тот символ, которым Вы разделяете введенные данные. Например, если аргументы записаны через запятую, тогда разделитель будет таким: <,>, если вертикальная палочка, <|>, если тире, <->, если пробел, < >. Если у Вас разделителем выступает пробел, тогда < > можно и вовсе не писать.
Что касается типов извлекаемых данных... Есть всего 4 типа:
Пример 1.
Вернемся к начальному примеру использования sscanf. В переменную string записаны два цвета: color1 и color2 через запятую. Нам нужно каждый из них увеличить на единицу (инкрементировать). Для этого сначала нужно получить каждый цвет из строки, а затем увеличивать их на единицу. Поскольку цвета имеют целочисленный тип данных, создаем две переменные типа integer:
Извлекаем оба цвета, записанных через запятую, из переменной string:
Опять же, так как цвета имеют целочисленный тип, то используем d в обеих случаях. Далее все просто, записываем обратно в строку string при помощи format две увеличенные на единицу переменные:
Но лучше сделать так, если хотите создать меньшую нагрузку на систему:
Пример 2.
Извлечем из переменной string три аргумента: UNIX время выдачи бана часа, UNIX время истечения бана чата и причину выдачи. Они записаны через пробел. UNIX время в обеих случаях приобретает целочисленный тип данных, а вот причина - строковый. Следовательно, выглядеть будет так: dds[100]. 100 я указал для примера. Допустим, максимальная длина причины не должна превышать 100 символов. В целом это будет выглядеть так:
Пример 3.
Создаем команду телепортации по указанным координатам. Допустим, координаты записаны через запятую в переменной string. В этом случае наш sscanf примет следующий вид:
Пример 4.
Ситуация посложнее. В переменную записаны дата и время какого-либо события: "2017-05-25 22:00". Сначала нужно извлечь три аргумента целочисленного типа, записанных через тире, а затем два аргумента целочисленных типов, записанных через двоеточие:
Ну и тогда в argument1 попадет 2017, в argument 2 - 05, в argument3 - 25, в argument 4 - 22, в аргумент 5 - 00.
Будет полезно при использовании данной функции в командах:
sscanf возвращает значение 0. Это значит, что для проверки, удалось ли найти все указанные аргументы нужно писать:
и, соответственно,
Пример команды /goto. Можно вводить координаты, можно вводить ID игрока, а можно просто ничего не вводить и телепортироваться на заданные кодом координаты:
Собственно это все. Автор: я, Elrmrnt-Kritik.
Сообщение отредактировал Elrmrnt-Kritik: 25 Май 2017 - 22:49



Сообщений: 3 284
Регистрация:
Skype: v.l.a.d.65
