繁体   English   中英

使用 `scanf()` 读取逗号分隔的输入

[英]read comma-separated input with `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
}

但是代码的执行给了我: illegal instruction

您将如何读取这样的逗号分隔文件?

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

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

在哪里:

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

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

你可以使用 scanf("%d%*c"); // 抑制任何你想跳过输入的字符

假设 scanf("%d%*c%d",&a,&b); // i/p 是 31,42 %* 用于抑制 o/p: 3142

它可以是任何字符 / , 。 ......

你遇到的问题是因为当你说

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM