问题如下:
#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
答案 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=1
,j=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
可以作为输入浮点数接受。