用scanf读取逗号分隔的输入

我有以下输入:

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

我希望它使用像这样的代码“解析”scanf:

 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 } 

但代码的执行给了我: illegale instruction你怎么读这样的逗号分隔文件?

逗号不被视为空格字符,因此格式说明符"%s"将使用该行,并且该行上的所有其他内容都会超出数组sem的边界,从而导致未定义的行为。 要更正此问题,您需要使用扫描集:

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

哪里:

  • %4[^,]表示最多读取四个字符或直到遇到逗号。

指定宽度可防止缓冲区溢出。

你遇到的问题是因为你说的时候

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

发生的事情是你正在尝试做的是你将所有的线都装入第一个只有5个字符的字符串。 因此sem[5]溢出 ,并且有各种各样有趣的东西。 为了避免这个问题,我尝试使用表达式%[^,] ,但它不是很有效。 最好的办法是使用类似的东西

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

然后你可以放弃ch 。 但请记住,最好使用其他函数来读取输入,例如getchar() ,以及类似的东西,它们在某种意义上更快更安全。