PDA

Просмотр полной версии : [Вопрос] sscanf



Gressie
11.08.2014, 17:14
Всем привет, у меня появилось затруднение. Как использовать sscanf в MySQL а именно в одно поле записать несколько значений и их же потом использовать.

DeimoS
11.08.2014, 19:31
sscanf - обычная функция-разделитель, а-ля split. Просто более функциональная и удобная. Нужно лишь разок прочитать описание на странице sa-mp.com с плагином. Не понимаю откуда у вас столько проблем с этой самой обычной функцией...

Ну как? Сначала формируем строку из данных и разделяем эти данные каким-то особенным символом, которого нет в тех данных, что вы разделяете.
Например:




new number_1 = 10;
new number_2 = 6;
new number_3 = 142;
new number_4 = 13;
new string[12] = "Я - Легенда";

Смотрим на наши данные и понимаем, что в качестве разделителя не получится использовать числа "0, 1, 2, 3, 4, 6", буквы "я, л, е, г, н, д, а", черту (дефис/тире) и пробел. Значит пред нами открываются все остальные символы, которые мы могли бы использовать в качестве разделителя финальной строки.
Использовать буквы или цифры не совсем целесообразно, ибо тогда данные будут сливаться и чтение/редактирование запакованной строки вручную окажется не самым удобным и приятным занятием. Поэтому от них мы откажемся. Значит стоит обратить свой взор на другие спец символы, которые бы не сливались с нашими данными. Допустим, мы взяли знак "точка с запятой (;)". Тогда наша финальная, запакованная строка будет выглядеть следующим образом: "10;6;142;13;Я - Легенда". Для хранения этой строки нам понадобится ещё один массив, который мы и создадим. Далее сформируем нашу строку с помощью функции format и запишем её в массив:


new buffer[24];
new number_1 = 10;
new number_2 = 6;
new number_3 = 142;
new number_4 = 13;
new string[12] = "Я - Легенда";
format(buffer, sizeof(buffer), "%d;%d;%d;%d;%s", number_1, number_2, number_3, number_4, string);

Всё. Теперь у нас есть запакованная строка с разными данными. Её уже и записываем куда нам надо.


Распаковать строку можно с помощью любой функции-разделителя. Ну раз вопрос идёт именно о sscanf, то покажу именно на примере sscanf. Работать будем с получившейся выше строкой.


new number_1;
new number_2;
new number_3;
new number_4;
new string[12];
sscanf(buffer, "p<;>iiiis[12]", number_1, number_2, number_3, number_4, string);


В массиве buffer хранится наша запакованная строка. Первым параметром функции sscanf указывается строка, с которой мы будем работать.


Далее в скобках мы указали то, какой разделитель должна искать наша функция sscanf в данной ей строке. Указали мы его в этом участке:
sscanf(buffer, "p<;>iiiis[12]", number_1, number_2, number_3, number_4, string);
Разделителем может быть любой символ/набор символов. Если же разделитель не указать, sscanf будет использовать в качестве разделителя пробел.


Далее указываем тип данных, который мы ожидаем получить из нашей строки, хранящейся в массиве "buffer". Сейчас мы указали 4 числа и строку.


Ну и потом идут переменные, в которые будут записаны наши распакованные данные.



Как-то так. Это самый примитивный способ :)

Gressie
12.08.2014, 16:12
Спасибо, тему можно закрывать думаю.

Osetin
12.08.2014, 16:16
Закрыто.