ho il seguente input:
AG23,VU,Blablublablu,8 IE22,VU,FooBlaFooBlaFoo,3 and so on...
lo voglio “analizzare” con scanf usando un 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 codice mi dà: illegale instruction
Come illegale instruction
un file separato da virgole come questo?
La virgola non è considerata un carattere di spaziatura, quindi l’identificatore di formato "%s"
consumerà il ,
e tutto il resto sulla linea scrivendo oltre i limiti dell’array sem
causa un comportamento indefinito. Per correggere questo devi usare un set:
while (scanf("%4[^,],%4[^,],%79[^,],%d", sem, type, title, &value) == 4)
dove:
%4[^,]
significa letto al massimo quattro caratteri o finché non viene rilevata una virgola. La specifica della larghezza impedisce il sovraccarico del buffer.
Il problema che stai avendo è perché quando dici
scanf("%s,%s,%s,%d", sem, type, title, &value)
quello che succede è che stai provando a fare è che stai inserendo tutta la linea nella prima stringa che è di soli 5 caratteri. Quindi il sem[5]
trabocca e usa tutti i tipi di cose divertenti. Per evitare questo problema, ho provato a usare l’espressione %[^,]
, ma non funziona. La soluzione migliore è usare qualcosa di simile
while(scanf("%s%c%s%c%s%c%d", sem, &ch, type, &ch, title, &ch, &value) != EOF)
Quindi puoi semplicemente 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.