Почему спецификация преобразования %lf не работает для Double в printf

Я пишу очень маленький код только scanf и printf. Я читаю двойное значение и печатаю его. Спецификация преобразования %lf правильно работает для чтения двойного значения. Но это не работает с printf.

Когда я пытаюсь напечатать это значение, я получаю вывод, например, 0.000000

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

Но если я использую %f в printf, он работает правильно.


person Dinesh Verma    schedule 24.07.2015    source источник
comment
Это работает!   -  person Kaustav Ray    schedule 24.07.2015
comment
Какую библиотеку компилятора/C вы используете?   -  person cremno    schedule 24.07.2015


Ответы (1)


Используемая вами реализация стандартной библиотеки C не соответствует C99 (или новее). Изменения, перечисленные в предисловии (пункт 5), содержат:

%lf спецификатор конверсии разрешен в printf

Описание модификатора длины l (C99+TC3 7.19.6.1 пар. 7, выделено мной):

Указывает, что следующий спецификатор преобразования d, i, o, u, x или X применяется к аргументу long int или unsigned long int; что следующий спецификатор преобразования n применяется к указателю на long int argument; что следующий спецификатор преобразования c применяется к аргументу wint_t; что следующий спецификатор преобразования s применяется к указателю на аргумент wchar_t; или не влияет на следующий спецификатор конверсии a, A, e, E, f, F, g или G.

Таким образом, %f и %lf эквивалентны. Оба ожидают double, потому что аргументы, совпадающие с многоточием (... в int printf(char const * restrict, ...);), подвергаются так называемому продвижению аргументов по умолчанию. Помимо прочего, они неявно преобразуют float в double. Для scanf() это не имеет значения, так как указатели не преобразуются неявно.

Поэтому, если вы не можете или не хотите обновляться до более новой стандартной библиотеки C, %f всегда можно использовать в строке формата printf() для печати float или double. Однако в строках формата scanf() %f ожидает float*, а %lf ожидает double*.

person cremno    schedule 24.07.2015