scanf中double的格式说明符

时间:2014-10-13 05:40:21

标签: c double scanf format-specifiers

我为了获得双重输入而编写了这个程序:

double n;
scanf("%lf",&n);
while(fgetc(stdin)!='\n')
    return 0;
printf("%lf",n);

这个程序应该是双重输入。如果%lf double scanf的格式说明符,我就会使用它。但是对于数字的输入,接着是e。例如(3e),输入正在被读取而没有错误。但是在处理同一个变量时,它会丢弃e并且仅考虑3语句所显示的printf。这种行为的原因是什么?

1 个答案:

答案 0 :(得分:1)

根据缺陷报告#22(http://www.open-std.org/jtc1/sc22/wg14/docs/rr/dr_022.html)中给出的基本原理,scanf(带有%lf)和strtod等函数应该消耗尽可能多的输入以满足预期浮点常量的格式。这意味着它们应该使用e中的"3e"字符,即使e字符后面没有实际的指数值(6.4.4.2要求指数值出现) 。

这同样适用于%lf%f。在我的实验中,它们在此输入上的行为完全相同。 (当然,%f需要float类型的目标变量。)

但是,即使在输入流中同时使用3e后,我也希望scanf(和strtod)将"3e"识别为浮点数的无效表示(因为6.4.4.2再次要求指数值存在)并相应地采取行动。在我的实验scanf中成功阅读了3.0。这个我无法解释。