sscanf. Разбить строку по массивам
#1

Привет всем. Вобщем тут возникла одна проблемка. У меня есть строка которая является результатом заброса к 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]: [3]
В то время как должно быть:
Код:
House 1[N]: Leonardo_Rivero[3]
Ну это ясно, я ведь не указал, что разделителем между массивами является "|". Но как это сделать, одновременно указав, что разделителями элементов массивов является ","?
Заранее спасибо.

P.S на англ форуме не писал, ибо англ знаю не очень.
Reply
#2

Код:
new gHouseOwnersNick[MAX_HOUSE_COUNT][30][MAX_PLAYER_NAME];
Попробуй убрать '[30]'.
Reply
#3

CaHbKo, спасибо за ответ, но это не то. Сейчас я попытаюсь рассказать что я хочу сделать. В общем я делаю систему многоэтажных домов. Массив gHouse содержит информацию о всем доме в целом: ID в БД MySQL,тип(многоэтажный или простой), класс дома(N,D,C,B,A), кол-во квартир в доме,цену и координаты. Матрица gHouseOwnersID содержит MySQL ID от аккаунта жильцов квартир каждого дома, а *матрица* gHouseOwnersNick содержит ники жильцов квартир каждого дома, где MAX_HOUSE_COUNT - максимальное число домов, [30] - максимальное число квартир в доме, а [MAX_PLAYER_NAME] - максимальная длина имени игрока. У меня появилась одна мысль как это сделать, но это не есть самый оптимизированный вариант. Как сделаю, напишу.
Reply
#4

Все ясно:
Код:
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();
Тему можно удалять.
Reply
#5

А с какой стати её удалять? Во первых пускай человек проверит код, а во вторых кому-то ещё может пригодится.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)