用scanf读取逗号分隔的输入

时间:2013-02-26 14:14:08

标签: c csv 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 你会如何读取这样的逗号分隔文件?

3 个答案:

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