失败匹配时的scanf(“...%n”,...)

时间:2011-11-12 16:52:59

标签: c scanf

我想计算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(消耗的字节数)。这种(愚蠢的)行为标准/平台是否具体?还是个bug?

我知道strtok或regular-expression打包,但我本来希望使用标准方法,而使用strtok的想法让我内心的软件工程师呕吐。

TIA

1 个答案:

答案 0 :(得分:0)

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

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);