C中的fscanf() – %s和%c之间的差异

我正在使用fscanf()函数来读取文本文件,如下所示:

d 5.234 f a 4.234 b d 53.5 c ... 

等等。 我想总结中间列中的值,但仅限于第一个字母为d且第二个为f的行。 我的代码如下所示:

 FILE *p; char x[2], z[2]; float y, sum=0; p=fopen("file.txt", "r"); if(p==NULL) return 1; while(!feof(p)) { fscanf(p, "%s %f %s", &x, &y, &z); if (x[0]=='d' && z[0]=='f') sum+=y; } 

并且它工作正常 – 只要x和z是数组。 如果我将它们声明为单个字符,那么告诉fscanf()扫描这样的(%c),由于某种原因它会在文件的最后一行中运行两次。 因此,如果最后一行符合要求,则总和大于它应该是的。 任何人都可以说出有什么区别吗?

你的错误是feof()。

如果上一次操作导致EOF,则触发。 使用%s,匹配器将继续读取直到达到EOF。 用%c它不会。 然后对fscanf()的下一次调用失败,但是你没有检查。

  while(!feof(fp)) { /* read from fp */ } 

是一种常见的反模式或错误。