【问题标题】:read comma-separated input with `scanf()`使用 `scanf()` 读取逗号分隔的输入
【发布时间】:2013-02-12 00:45:56
【问题描述】:

我有以下输入:

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

你会如何阅读这样一个逗号分隔的文件?

【问题讨论】:

    标签: c csv input file-io scanf


    【解决方案1】:

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

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

    地点:

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

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

    【讨论】:

    • 请注意,即使没有发生溢出,格式中的以下,也不会匹配。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

       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() 之类的,从某种意义上说,这样更快更安全。

      【讨论】:

      • 您的“最佳选择”的问题在于它也不太有效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      相关资源
      最近更新 更多