2013-06-27 7 views
-1

Итак, я пробовал почти все решения для подобных вопросов, и ни одна из них не работала. У меня есть строка, которая выглядит следующим образом:sscanf для отдельных строк (более 2 строк)

AAAA BBBBBBBBBBBB CCCCCCC 15 
    %s   %s  %s %d 

Я до сих пор пытался это нравится:

sscanf(str, "%s %s %s %d", ...); 

Это не сработало первое% s съел «» также и все пошло не так , После этого я пробовал как:

sscanf(str, "%6[^ ] %30[^ ] %8[^ ] %d[^\n]", ...); 

То же самое происходит. Как я могу разделить части этой строки на sscanf?

Редактировать: Результат должен идти в структуре. текущий код выглядит следующим образом:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct sor { 
    char npkod[6]; 
    char nev[30]; 
    char tkod[8]; 
    int jegy; 
} SOR; 

double work(char* fnev, char* tkod) 
{ 
    FILE * fp; 
    char aktualis_sor[127] = { 0 }; 
    SOR beolvasott_sor; 
    double atlag = 0.0; 
    int ossz = 0; 
    int db = 0; 

    fp = fopen(fnev, "rb"); 
    if(fp == NULL) 
    { 
     printf("Fajl nem talalhato.\n"); 
     return -1; 
    } 

    while(fgets(aktualis_sor, 127, fp)) 
    { 
     sscanf(aktualis_sor, "%6[^ ] %30[^ ] %8[^ ] %d", beolvasott_sor.npkod, beolvasott_sor.nev, beolvasott_sor.tkod, &beolvasott_sor.jegy); 
     printf("%s %s %s %d\n\n\n", beolvasott_sor.npkod, beolvasott_sor.nev, beolvasott_sor.tkod, beolvasott_sor.jegy); 

     if(strcmp(beolvasott_sor.tkod, tkod) == 0) 
     { 
      ossz += beolvasott_sor.jegy; 
      ++db; 
     } 
    } 

    fclose(fp); 

    atlag = (double)ossz/(double)db; 

    return atlag; 
} 

int main(void) 
{ 
    printf("Atlag: %f\n", work("tan.txt", "INDK1010")); 
    return 0; 
} 

А вот актуальная проблема: Оригинал: AAA111 Harminckarakteresnevaaaaaaaaaa INDK1010 5

Printf после sscanf: AAA111HarminckarakteresnevaaaaaaaaaaINDK1010 ♣ HarminckarakteresnevaaaaaaaaaaINDK1010 ♣ INDK1010 ♣ 5

+3

См. Http://stackoverflow.com/questions/2091815/how-to-split-string-to-tokens-in-c для использования 'strchr' вместо' sscanf' –

+1

Показать больше (и скомпилировать) пример кода , Эти вызовы 'sscanf()' отлично работают для меня, когда они передаются в разумных аргументах для размещения анализируемых данных. Я подозреваю, что вы можете проходить через фиктивные указатели или буферы, которые слишком малы. –

+0

@Joey Egyetemi feladat? Нептун («нпкод»)? : D Лучше использовать 'strchr()' и/или 'strtok_r()'. Кроме того, 'const'-квалифицируйте свои входные аргументы. –

ответ

2

Вы пишете прошлое конец ваших строковых буферов.

Приведено описание преобразования, например "%6[^ ]". семейство функций scanf() будет считывать до 6 символов из потока (или строки в этом случае) для ввода в указанный буфер. Затем он будет игнорировать буфер - так что ваш буфер должен быть как минимум на один символ больше, чем спецификация длины, которую вы предоставляете.

0

Если вы не знаете, почему возникает конкретная проблема или почему фактическая программа не работает, пожалуйста, не проголосуйте. Просто раздражает, что вы не знаете, в чем проблема, попробуйте ответить на совершенно другой вопрос и проголосовать за проблему, которую я пытаюсь решить. Спасибо за Майкла Burr Я знал, что единственная проблема была:

Make the char arrays large enough to store a '\0' also. 

char xxx[6]; 

"AAA111" with %6[^ ] how would 7 bytes fit into 6 bytes? 

Подумайте о downvotes и нерелевантные ответы, прежде чем вы комментируете людей.