leggere l’input separato da virgole con scanf

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.