fscanf无法检测到匹配失败。 libc bug还是没有?

时间:2014-10-27 07:24:20

标签: c scanf libc

问题如下:


#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  float f = 0.0f;
  int n = 0;

  n = fscanf(stdin, "%f", &f);
  printf("n = %d, f = %f\n", n, f);

  return 0;
}

打印:

  

n = 1,f = 100.0000

如果输入字符串是:

  

100ergs

已提供给stdin。在gcc(4.8.1)和VS2010(和更低版本)上发生以下行为。这是一个错误,还是我错过了什么?因为7.19.6.2.19和7.19.6.2.20节中的c标准(c89)明确指出由于匹配失败,n应该等于零。

UPD。只是一些额外的信息:

1)来自标准的例子:

http://port70.net/~nsz/c/c99/n1256.html#7.19.6.2p20(请联系Chris Culter获取链接)

2)匹配失败的类似示例按预期工作:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  int hex = 0x0;
  int n = 0;

  n = fscanf(stdin, "%x", &hex);
  printf("n = %d, hexVal = %x\n", n, hex);

  return 0;
}

如果stdin包含0xz输出

  

n = 0,hexVal = 0

2 个答案:

答案 0 :(得分:1)

除非他们对最终标准进行了更改,否则您看到的行为就是错误。 (感谢HighPredator的链接)

Difference between scanf() and strtol() / strtod() in parsing numbers

答案 1 :(得分:0)

您正在阅读信息流。 fscanf获取所有可接受的字符...并将其余字符留给下一次读取操作。在C中,以下两个片段给出了相同的结果:

int i, j;
fscanf(stdin, "%d", &i);
fscanf(stdin, "%d", &j);

int i, j;
fscanf(stdin, "%d%d", &i, &j);

如果您使用1 2投放,则会获得i=1j=2

您对此有何期望:

float f = 0.0f;
int n = 0;
char c[16];

n = fscanf(stdin, "%f", &f);
printf("n = %d, f = %f\n", n, f);
n = fscanf(stdin, "%15s", c);
printf("n = %d, string = %s\n", n, c);

使用100erg投放时,您会收到:

n = 1, f = 100.0000
n = 1, string = erg

因此,当前fscanf结果完全正确,因为100可以作为输入浮点数接受。