用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()
,以及类似的东西,它们在某种意义上更快更安全。