sscanf, разбор строки.
#1

Доброго времени суток.

Есть строка: 0,10|0,110|0,0|1,2|0,0|6,70|0,0|0,0|0,0|0,0|0,0|0, 0|0,0|0,0|0,0|0,0|0,0|0,0|0,0|0,0
20 ячеек, в каждой ТИП и КОЛ-ВО.


Массив:
PHP код:
enum _inventory {
    
TYPE,
    
NUM
}
new 
INVENTORY MAX_PLAYERS ] [ 20 ] [ _inventory ] ; 
Как, более грамотно, при помощи sscanf, вытащить данные из строки, и записать в массив?

Что-то вроде такого:
PHP код:
sscanf temp"p<|>e<ip<,>i>[20]"INVENTORY ] ) 
Reply
#2

Сразу скажу, что ты неправильно походишь к инвентарю. Нужно разбить на строки инвентарь так, чтобы в каждой строке описывался 1 предмет, тогда ты сможешь записывать в файл только те строки вещей,которые есть у игрока -> экономия времени загрузки(хоть и не большая) + в будущем не будет проблем с увеличением лимита вещей в инвентаре.
Reply
#3

Хм. Не совсем понял что ты имел ввиду. Не мог бы показать небольшой пример.

Сейчас у меня хранится строка с инвентарем, в таблице игроков, в одной ячейке.
Я еще думал сделать отдельную таблицу для инвентаря, с ячейками ID_PLAYER | ITEM_TYPE | NUMS, но подумал что в этом нет необходимости.
Reply
#4

Принцип сканирования:


pawn Код:
sscanf(temp,"p<|>s[15]s[15]s[15]s[15]s[15]s[15]s[15]s[15]",itog,itog,itog,itog,itog,itog,itog);
Где: temp - строка содержащая "кашу", и которую нужно отсортировать. p<|> означает что все значения этой строки мы будем отделять попеременно этим символом '|'. И отделять мы их будем как строку (не как число, так как у Вас там идут 2 числа и запятая). itog - куда мы выведем одну из частей той большой строки разделением знаком '|'.

В итоге в переменной itog, у вас будет такого типа данные "14,176" - тобишь числа, но они в види текста! Ну и далее мы так может каждую строчку отделить.

Конечно способ это несколько муторный. Но может я не совсем понял что вам нужно?
Reply
#5

Quote:
Originally Posted by Urukhay
Посмотреть сообщение
Принцип сканирования:


pawn Код:
sscanf(temp,"p<|>s[15]s[15]s[15]s[15]s[15]s[15]s[15]s[15]",itog,itog,itog,itog,itog,itog,itog);
Где: temp - строка содержащая "кашу", и которую нужно отсортировать. p<|> означает что все значения этой строки мы будем отделять попеременно этим символом '|'. И отделять мы их будем как строку (не как число, так как у Вас там идут 2 числа и запятая). itog - куда мы выведем одну из частей той большой строки разделением знаком '|'.

В итоге в переменной itog, у вас будет такого типа данные "14,176" - тобишь числа, но они в види текста! Ну и далее мы так может каждую строчку отделить.

Конечно способ это несколько муторный. Но может я не совсем понял что вам нужно?
Спасибо конечно. Но я хотел бы обойтись без костыля, думал можно вытащить все более "красиво", через несколько аргументов. А так, можно сделать немного и попроще.

Наверно буду думать, как по другому сохранять инвентарь. Если кто подскажет оптимальный вариант, буду рад .
Reply
#6

invt|0|ITEM_TYPE|NUM\n
invt|1|ITEM_TYPE|NUM\n
...
invt|N|ITEM_TYPE|NUM\n
где invt - ключ(нужно, если у тебя на файлах), N - номер слота. И построчно анализируешь - записывать можно лишь те, которые есть у игрока.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)