18

我有以下输入:

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

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

4

3 回答 3

50

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

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

在哪里:

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

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

于 2013-02-26T14:20:05.963 回答
0

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

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

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

于 2020-08-23T06:16:09.137 回答
-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(), 和类似的东西,这在某种意义上更快更安全。

于 2013-02-26T14:51:50.750 回答