我有以下输入:
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
你会如何读取这样的逗号分隔文件?
答案 0 :(得分:37)
逗号不被视为空格字符,因此格式说明符"%s"
将使用,
以及行上写入超出数组sem
边界的所有其他内容,从而导致未定义的行为。要纠正此问题,您需要使用扫描集:
while (scanf("%4[^,],%4[^,],%79[^,],%d", sem, type, title, &value) == 4)
其中:
%4[^,]
表示最多只读取四个字符或直到遇到逗号。指定宽度可防止缓冲区溢出。
答案 1 :(得分:0)
您可以使用 scanf(“%d%* c”); //禁止显示您想跳过输入的任何字符
假设scanf(“%d%* c%d”,&a,&b); // i / p为31,42%*用于抑制 o / p:3142
它可以是任何字符/。 .......
答案 2 :(得分:-1)
你遇到的问题是因为当你说
时 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()
之类的输入,以及类似的东西,它们在某种意义上更快更安全。