web-dev-qa-db-fra.com

lire l'entrée séparée par des virgules avec `scanf ()`

J'ai l'entrée suivante:

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

Je veux qu'il "analyse" avec scanf() en utilisant un code comme celui-ci:

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
}

Mais l'exécution du code me donne: illegal instruction

Comment liriez-vous un fichier séparé par des virgules comme celui-ci?

15
Moonlit

La virgule n'est pas considérée comme un espace, donc le spécificateur de format "%s" consommera le , et tout le reste de la ligne écrivant au-delà des limites du tableau sem provoquant un comportement indéfini. Pour corriger cela, vous devez utiliser un scanset:

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

où:

  • %4[^,] signifie lire au plus quatre caractères ou jusqu'à ce qu'une virgule soit rencontrée.

La spécification de la largeur empêche le dépassement de tampon.

39
hmjd