我为了获得双重输入而编写了这个程序:
double n;
scanf("%lf",&n);
while(fgetc(stdin)!='\n')
return 0;
printf("%lf",n);
这个程序应该是双重输入。如果%lf
是 double
中scanf
的格式说明符,我就会使用它。但是对于数字的输入,接着是e。例如(3e),输入正在被读取而没有错误。但是在处理同一个变量时,它会丢弃e
并且仅考虑3
语句所显示的printf
。这种行为的原因是什么?
答案 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
类型的目标变量。)
但是,即使在输入流中同时使用3
和e
后,我也希望scanf
(和strtod
)将"3e"
识别为浮点数的无效表示(因为6.4.4.2再次要求指数值存在)并相应地采取行动。在我的实验scanf
中成功阅读了3.0
。这个我无法解释。