【问题标题】:scanf("...%n",...) on failing matchscanf("...%n",...) 匹配失败
【发布时间】:2011-11-12 16:52:58
【问题描述】:

考虑到其元素的字符串模式,我想计算 CSV 文件中的“列”,例如

   1,2,3,4 

带有模式“%d”的应该返回 4。

我写了一个这样的分词器

offset = 0;
strcpy(var_pattern, pattern) // e.g. pattern = "%d," 
strcat(var_pattern, "%n")
while (sscanf(&line[offset], LINE_SIZE, buf,var_pattern,&bytes_consumed > 0) {
      count++; // column counter
      offset += bytes_consumed
};

我遇到的问题是 CSV 文件行中的最后一个元素在示例中缺少分隔符“,”。在 linux64/gcc 上做

    c = sscanf("12","%d,%n",&a,&b)

给出 c=1(匹配的模式数)、a=12 和 b=32767(消耗的字节数)。这是(愚蠢的)行为标准/平台特定的吗?还是错误?

我知道 strtok 或正则表达式打包,但我想使用标准方法,使用 strtok 的想法让我内心的软件工程师呕吐。

TIA

【问题讨论】:

    标签: c scanf


    【解决方案1】:

    您的解决方案很难,更容易的是:

    char *s="1,2,3,4";
    int n,i;
    while( 1==sscanf(s,"%d%n",&i,&n) && (s+=n,*s==','?++s:!*s) )
      printf("%d\n",i);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多