I am writing a very small code just scanf
and printf
. I am reading a double value and printing it. The conversion specification %lf
works properly to read a double value. But, it doesn't work with printf.
When I am trying to print that value I am getting output like 0.000000
double fag;
scanf("%lf", &fag);
printf("%lf", fag);
But, if I use %f in printf it works properly.
The C standard library implementation you're using doesn't conform to C99 (or newer). The changes listed in the foreword (paragraph 5) contain:
%lf
conversion specifier allowed inprintf
The description of the l
length modifier is (C99+TC3 7.19.6.1 par. 7, emphasis mine):
Specifies that a following
d
,i
,o
,u
,x
, orX
conversion specifier applies to along int
orunsigned long int
argument; that a followingn
conversion specifier applies to a pointer to along int argument
; that a followingc
conversion specifier applies to awint_t
argument; that a followings
conversion specifier applies to a pointer to awchar_t
argument; or has no effect on a followinga
,A
,e
,E
,f
,F
,g
, orG
conversion specifier.
%f
and %lf
are therefore equivalent. Both expect a double
because arguments matching the ellipsis (the ...
in int printf(char const * restrict, ...);
) undergo the so-called default argument promotions. Among other things they implicitly convert float
to double
. It doesn't matter for scanf()
since pointers aren't implicitly converted.
So if you can't or don't want to update to a newer C standard library %f
can always be used in a printf()
format string to print float
or double
. However in scanf()
format strings %f
expects float*
and %lf
expects double*
.
来源:https://stackoverflow.com/questions/31600931/why-conversion-specification-lf-does-not-work-for-double-in-printf