2013-02-26 18 views
9

ho la seguente ingresso:lettura ingresso separato da virgole con scanf

AG23,VU,Blablublablu,8 
IE22,VU,FooBlaFooBlaFoo,3 
and so on... 

lo voglio "analizzare" con scanf usando qualche codice come questo:

char sem[5]; 
char type[5]; 
char title[80]; 
int value; 

while(scanf("%s,%s,%s,%d", sem, type, title, &value) == 4) { 
//do something with the read line values 
} 

Ma l'esecuzione del il codice mi dà: illegale instruction Come leggeresti un file separato da virgole come questo?

risposta

28

La virgola non è considerata un carattere di spazio vuoto, pertanto lo specificatore di formato "%s" consumerà lo , e tutto il resto sulla linea scrivendo oltre i limiti dell'array sem causando un comportamento non definito. Per correggere questo è necessario utilizzare uno scanset:

while (scanf("%4[^,],%4[^,],%79[^,],%d", sem, type, title, &value) == 4) 

dove:

  • %4[^,] significa leggere al massimo quattro caratteri o fino a quando si incontra una virgola.

La specifica della larghezza impedisce l'overrun del buffer.

-1

Il problema che si stanno avendo è perché quando si dice

scanf("%s,%s,%s,%d", sem, type, title, &value) 

quello che succede è che si sta tentando facendo è che si intende installare tutta la linea nella prima stringa che è a soli 5 caratteri. Pertanto lo sem[5] trabocca e utilizza tutti i tipi di cose divertenti. Per evitare questo problema, ho provato a utilizzare l'espressione %[^,], ma non funziona. La cosa migliore è quella di usare qualcosa come

while(scanf("%s%c%s%c%s%c%d", sem, &ch, type, &ch, title, &ch, &value) != EOF) 

Poi si può solo scartare il ch. Tuttavia, tenete a mente che è meglio usare altre funzioni per leggere input come getchar() e cose del genere, che sono molto più veloci e più sicure in un certo senso.

+0

Il problema con la "migliore scommessa" è che non funziona nemmeno. –

Problemi correlati