【问题标题】:format specifier for double in scanfscanf 中双精度的格式说明符
【发布时间】:2014-10-13 05:40:20
【问题描述】:

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

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

这个程序应该接受 double 作为输入。假设%lfscanfdouble 的格式说明符,我就使用了它。但是对于后跟 e 的数字输入。例如(3e),输入被正确读取。但是在处理同一变量期间,它会丢弃e,只考虑3,如printf 语句所示。这种行为的原因是什么?

【问题讨论】:

    标签: c double scanf format-specifiers


    【解决方案1】:

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

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

    但是,即使在从输入流中同时使用 3e 之后,我仍希望 scanf(和 strtod)将 "3e" 识别为浮点数的无效表示(因为,同样,6.4.4.2 要求存在指数值)并采取相应措施。在我的实验中scanf 成功读取3.0。这个我还不能解释。

    【讨论】:

    • @darknight:不确定你的意思。我看不出%lf%f 的行为有什么不同。该标准在scanf 中为double 指定%lf%f 代表float
    猜你喜欢
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 2012-10-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    相关资源
    最近更新 更多