sscanf. Разбить строку по массивам -
kazmorebig - 04.08.2011
Привет всем. Вобщем тут возникла одна проблемка. У меня есть строка которая является результатом заброса к mysql. Вот она:
Код:
1|2|N|15|70000|2522.87|-1343.69|31.0226|89.9235|3,0,0,0,0,0,0,0,0,0,0,0,0,0,0|Leonardo_Rivero,,,,,,,,,,,,,,
Я эту строку разбиваю в 1 enum и в два массива:
PHP код:
enum HOUSE_DATA
{
houseID,
houseType,
houseClass,
houseApartmentCount,
housePrice,
Float:houseX,
Float:houseY,
Float:houseZ,
Float:houseR
}
new gHouses[MAX_HOUSE_COUNT][HOUSE_DATA];
new gHouseOwnersID[MAX_HOUSE_COUNT][30];
new gHouseOwnersNick[MAX_HOUSE_COUNT][30][MAX_PLAYER_NAME];
Делю я это так:
PHP код:
mysql_query("SELECT * FROM `houses`");
mysql_store_result();
if(mysql_num_rows() >= MAX_HOUSE_COUNT) print("Кол-во домов в базе больше максимального");
else if(!mysql_num_rows()) print("Домов в базе не найдено");
else
{
for(new i;i<mysql_num_rows();i++)
{
new result[256];
mysql_fetch_row(result);
sscanf(result,"p<|>e<iiciiffff>p<,>a<d>[30]a<s[24]>[30]",gHouses[i],gHouseOwnersID[i],gHouseOwnersNick[i]);
printf("House %d[%c]: %s[%d]",gHouses[i][houseID],gHouses[i][houseClass],gHouseOwnersNick[i][0],gHouseOwnersID[i][0]);
gHousePickup[i] = CreateDynamicPickup(1273,1,gHouses[i][houseX],gHouses[i][houseY],gHouses[i][houseZ]);
}
}
mysql_free_result();
В результате sscanf ругается, что я какбы где-то забыл закрыть скобку:
Код:
sscanf warning: Unclosed specifier parameter, assuming '<', consider using something like p<<>.
И еще что я не указал размер массива/строки:
Код:
sscanf error: String/array must include a length, please add a destination size.
Я пробовал в различных комбинациях использовать
p<> вот что из этого получалось.
PHP код:
"p<|>e<iiciiffff>p<,>a<d>[30]a<s[24]>[30]"
Ошибок не выдвавал, но
printf() выводил вот что:
В то время как должно быть:
Код:
House 1[N]: Leonardo_Rivero[3]
Ну это ясно, я ведь не указал, что разделителем между массивами является "|". Но как это сделать, одновременно указав, что разделителями элементов массивов является ","?
Заранее спасибо.
P.S на англ форуме не писал, ибо англ знаю не очень.
Re: sscanf. Разбить строку по массивам -
CaHbKo - 04.08.2011
Код:
new gHouseOwnersNick[MAX_HOUSE_COUNT][30][MAX_PLAYER_NAME];
Попробуй убрать '[30]'.
Re: sscanf. Разбить строку по массивам -
kazmorebig - 05.08.2011
CaHbKo, спасибо за ответ, но это не то. Сейчас я попытаюсь рассказать что я хочу сделать. В общем я делаю систему многоэтажных домов. Массив
gHouse содержит информацию о всем доме в целом: ID в БД MySQL,тип(многоэтажный или простой), класс дома(N,D,C,B,A), кол-во квартир в доме,цену и координаты. Матрица gHouseOwnersID содержит MySQL ID от аккаунта жильцов квартир каждого дома, а *матрица* gHouseOwnersNick содержит ники жильцов квартир каждого дома, где
MAX_HOUSE_COUNT - максимальное число домов,
[30] - максимальное число квартир в доме, а
[MAX_PLAYER_NAME] - максимальная длина имени игрока. У меня появилась одна мысль как это сделать, но это не есть самый оптимизированный вариант. Как сделаю, напишу.
Re: sscanf. Разбить строку по массивам -
kazmorebig - 05.08.2011
Все ясно:
Код:
sscanf error: Strings are not supported in arrays.
Решиль проблему с помощью функции:
pawn Код:
stock explode(aExplode[][], const sSource[], const sDelimiter[] = " ", iVertices = sizeof aExplode, iLength = sizeof aExplode[])
{
new
iNode,
iPointer,
iPrevious = -1,
iDelimiter = strlen(sDelimiter);
while(iNode < iVertices)
{
iPointer = strfind(sSource, sDelimiter, false, iPointer);
if(iPointer == -1)
{
strmid(aExplode[iNode], sSource, iPrevious, strlen(sSource), iLength);
break;
}
else
{
strmid(aExplode[iNode], sSource, iPrevious, iPointer, iLength);
}
iPrevious = (iPointer += iDelimiter);
++iNode;
}
return iPrevious;
}
так:
pawn Код:
mysql_query("SELECT * FROM `houses`");
mysql_store_result();
if(mysql_num_rows() >= MAX_HOUSE_COUNT) print("Кол-во домов в базе больше максимального");
else if(!mysql_num_rows()) print("Домов в базе не найдено");
else
{
for(new i;i<mysql_num_rows();i++)
{
new result[256];
mysql_fetch_row(result);
new ids[256],nicks[900];
sscanf(result,"p<|>e<iiciiffff>s[256]s[900]",gHouses[i],ids,nicks);
sscanf(ids,"p<,>a<i>[30]",gHouseOwnersID[i]);
explode(gHouseOwnersNick[i],nicks,",");
printf("House %d[%c]: %s[%d]",gHouses[i][houseID],gHouses[i][houseClass],gHouseOwnersNick[i][0],gHouseOwnersID[i][0]);
gHousePickup[i] = CreateDynamicPickup(1273,1,gHouses[i][houseX],gHouses[i][houseY],gHouses[i][houseZ]);
}
}
mysql_free_result();
Тему можно удалять.
Re: sscanf. Разбить строку по массивам -
CaHbKo - 05.08.2011
А с какой стати её удалять? Во первых пускай человек проверит код, а во вторых кому-то ещё может пригодится.