【问题标题】:Why Conversion Specification %lf does not work for Double in printf为什么转换规范 %lf 对 printf 中的 Double 不起作用
【发布时间】:2015-07-24 01:53:14
【问题描述】:

我正在编写一个非常小的代码,只是 scanfprintf。我正在读取一个 double 值并打印它。转换规范%lf 可以正常读取双精度值。但是,它不适用于 printf。

当我尝试打印该值时,我得到的输出类似于 0.000000

double fag;
scanf("%lf", &fag);
printf("%lf", fag);

但是,如果我在 printf 中使用 %f,它可以正常工作。

【问题讨论】:

标签: c format-specifiers


【解决方案1】:

您使用的 C 标准库实现不符合 C99(或更高版本)。前言(第 5 段)中列出的更改包含:

%lfprintf 中允许的转换说明符

l 长度修饰符的描述是(C99+TC3 7.19.6.1 par. 7,重点是我的):

指定以下diouxX 转换说明符适用于long intunsigned long int 参数;后面的n 转换说明符适用于指向long int argument 的指针;后面的c 转换说明符适用于wint_t 参数;后面的s 转换说明符适用于指向wchar_t 参数的指针; 或对以下aAeEfFgG 转换说明符没有影响。

%f%lf 因此是等价的。两者都期望double,因为与省略号匹配的参数(int printf(char const * restrict, ...); 中的...)经历了所谓的默认参数提升。除其他外,它们将float 隐式转换为doublescanf() 无关紧要,因为指针不会被隐式转换。

因此,如果您不能或不想更新到较新的 C 标准库 %f,则始终可以在 printf() 格式字符串中使用以打印 floatdouble。但是在 scanf() 格式字符串中,%f 需要 float*%lf 需要 double*

【讨论】:

    猜你喜欢
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 2023-03-16
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多