PDA

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



SnyXes
25.01.2017, 22:06
sscanf(s_friends, "p<,>a<s[24]>[25]", pFriendNick[playerid]);

Хочу через sscanf разобрать строку в массив, но этот код не работает (массив пустой после разбора).

Вот строка которую надо разобрать: ",,,,,,,,,,,,,,,,,,,,,,,,". В этой строке ники друзей разделены запятыми (пока что пусто потому что нет друзей, если добавить например 3-4 друга, строка выглядела бы так: "Друг1,Друг2,Друг3,,,,,,,,,,,,,,,,,,,,,,"). Ну здесь думаю все понятно, перейдем к самому массиву в который нужно записать ники друзей.

Массив глобальный.
new pFriendNick[MAX_PLAYERS][MAX_FRIENDS][MAX_PLAYER_NAME];
Где MAX_PLAYERS - 1000, MAX_FRIENDS - 25, MAX_PLAYER_NAME - 24;

P.S. Я чувствую что проблема в s[24], потому что с целочисленными значениями все работает на ура!
Вот так разбираю целочисленные значения:
sscanf(s_weapons, "p<,>a<i>[20]", PlayerInfo[playerid][pWeapon]);

P.P.S. Я все перепроверил. Я уверен, что строковая переменная которую я разделяю не пустая и т.д.

Seviel
26.01.2017, 00:29
Простите что не по теме, но по мне легче сделать отдельную таблицу(ну или файл) в котором будут хранится связи, с двумя столбцами в одном будут хранится имя(ну или id) того у кого ищешь друзей, а второй имя друга. и когда надо SQL запросом(например для sql SELECT `friend` FROM `friends` WHERE `user`='Player', а на файлах не знаю) выводишь выборку. Как по мне меньше мороки.

ziggi
26.01.2017, 01:17
В sscanf, похоже, передаётся ссылка на всю переменную, а не на ячейку в массиве, поэтому такая ерунда и происходит.
Может быть есть варианты получше, но я могу предложить что-то вроде этого:

new temp[MAX_FRIENDS][MAX_PLAYER_NAME];
sscanf(s_friends, "p<,>a<s[24]>[25]", temp);
pFriendNick[playerid] = temp;

P.S. Рекомендую константные значения в sscanf записывать таким образом:

"p<,>a<s[" #MAX_PLAYER_NAME "]>[" #MAX_FRIENDS "]"

SnyXes
26.01.2017, 13:25
Спасибо, придется использовать такой обход.)
Странно... ведь с целочисленным двумерным массивом все работает нормально, может быть sscanf не работает с трехмерными массивами. Проверю как нибудь.)

- - - Добавлено - - -


Простите что не по теме, но по мне легче сделать отдельную таблицу(ну или файл) в котором будут хранится связи, с двумя столбцами в одном будут хранится имя(ну или id) того у кого ищешь друзей, а второй имя друга. и когда надо SQL запросом(например для sql SELECT `friend` FROM `friends` WHERE `user`='Player', а на файлах не знаю) выводишь выборку. Как по мне меньше мороки.

Тогда в этой таблице кол-во строк может дойти до 3 000 000 строк (если 100.000 аккаунтов зарегистрировано и у них всех по 25 друзей, я уже не говорю про запросы в друзья (входящие и исходящие, в них тоже макс. запросов 25), получается уже не 3 000 000, а 9 000 000).
Работать с таким огромным кол-вом строк не оптимизированно я считаю. Большая нагрузка на MySQL сервер, да и вообще если вдруг мне понадобится вручную удалить какого-нибудь друга, я могу запросто это сделать изменив всего лишь одну ячейку в БД.

Так же есть вариант в каждой строке 25 ячеек для каждого друга создать, но это тоже не вариант поскольку на сервере придется считывать значения из каждой ячейки, что тоже влияет на нагрузку MySQL сервера.

qwezert
26.01.2017, 13:38
Спасибо, придется использовать такой обход.)
Странно... ведь с целочисленным двумерным массивом все работает нормально, может быть sscanf не работает с трехмерными массивами. Проверю как нибудь.)

- - - Добавлено - - -



Тогда в этой таблице кол-во строк может дойти до 3 000 000 строк (если 100.000 аккаунтов зарегистрировано и у них всех по 25 друзей, я уже не говорю про запросы в друзья (входящие и исходящие, в них тоже макс. запросов 25), получается уже не 3 000 000, а 9 000 000).
Работать с таким огромным кол-вом строк не оптимизированно я считаю. Большая нагрузка на MySQL сервер, да и вообще если вдруг мне понадобится вручную удалить какого-нибудь друга, я могу запросто это сделать изменив всего лишь одну ячейку в БД.

Так же есть вариант в каждой строке 25 ячеек для каждого друга создать, но это тоже не вариант поскольку на сервере придется считывать значения из каждой ячейки, что тоже влияет на нагрузку MySQL сервера.

Что то ты написал слишком замудрено. В бд можно спокойно создать связь 1 ко многим или многие ко многим и свзяывать столько id игроков между собой - сколько влезет и ненужно никаких 9млн строк(хотя базы данных работают с куда большими обьемами - на это они и расчитаны, на моем проекте 18млн строк и сайт летает как самолет)

Seviel
26.01.2017, 18:34
Тогда в этой таблице кол-во строк может дойти до 3 000 000 строк (если 100.000 аккаунтов зарегистрировано и у них всех по 25 друзей, я уже не говорю про запросы в друзья (входящие и исходящие, в них тоже макс. запросов 25), получается уже не 3 000 000, а 9 000 000).
Работать с таким огромным кол-вом строк не оптимизированно я считаю. Большая нагрузка на MySQL сервер, да и вообще если вдруг мне понадобится вручную удалить какого-нибудь друга, я могу запросто это сделать изменив всего лишь одну ячейку в БД.

3 миллиона строк SQL в легкую сможет обработать(ну тут форум (http://www.linux.org.ru/forum/web-development/5139765)(эт не реклама, честно) там можно посмотреть какие таблицы и как быстро они обрабатывают) ты получаешь выборку, допустим 25 строк, а обработать 25 строк в павн, дело легкое и не затратное(я 1000 строк в цикле обрабатываю, и у меня они обрабатываются за миллисекунды).

Большая нагрузка на MySQL сервер, да и вообще если вдруг мне понадобится вручную удалить какого-нибудь друга, я могу запросто это сделать изменив всего лишь одну ячейку в БД.
Чтобы удалить друга, просто удаляешь строку, и поверь это будет легче чем удалить ячейку, вот так удалить строку


DELETE FROM `friends` WHERE `id`='Player' AND `friend`='friend';

Если я правильно понимаю тебе придется разбить строку в массив удалить ячейку, а потом обратно склеить в строку?