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:
%lfconversion 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, orXconversion specifier applies to along intorunsigned long intargument; that a followingnconversion specifier applies to a pointer to along int argument; that a followingcconversion specifier applies to awint_targument; that a followingsconversion specifier applies to a pointer to awchar_targument; or has no effect on a followinga,A,e,E,f,F,g, orGconversion 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