Есть ли разница в использовании %f, %e, %g, %E или %G с scanf?
В C есть ли разница в спецификаторах формата %f, %e, %g, %E и %G при использовании для чтения в переменную float с помощью scanf? То есть будет ли поведение фрагмента кода
float x;
scanf("%<one of f, e, g, E, G>", &x);
не зависит от выбора описатель?
сначала я предположил, что %f будет правильно интерпретировать только десятичные обозначения, А %e будет правильно интерпретировать только научные обозначения, но в моей системе каждый из них отлично работает в любом случае. Но, может быть, моя система просто либерал...
Я не мог найти никакого определенного утверждения об этом в моих книгах или в интернете...
5 ответов
ответ выше относится к C++, но то же самое верно для С.
из "7.19.6.2 функция fscanf" в "окончательный вариант стандарта C99 с включенными исправлениями TC1, TC2 и TC3, отформатированный как проект" (ссылка скопирована из http://en.wikipedia.org/wiki/C99):
a, e, f, g
Соответствует необязательному знаковому числу с плавающей запятой, бесконечность, или NaN, формат которого совпадает с ожидаемым для последовательность темы функции strtod. Соответствующий аргумент должен быть указателем плыть.спецификаторы преобразования A, E, F, G, и X также действительны и вести себя так же, как, соответственно, a, e, f, g, и x.
Так %f, %e, %g, %E, %G
все ведут себя одинаково, когда сканирование цифры, как вы испытали.
f,e,g
все для числа с плавающей запятой
С doc:-
ряд десятичных цифр, возможно содержащую десятичную точку, необязательно перед знаком (+ или -) и необязательно за знаком символ e или E и десятичное целое число (или некоторые другие последовательности поддерживается strtod). Реализации, соответствующие C99, также поддерживают шестнадцатеричный формат с плавающей запятой, если ему предшествует 0x или 0х.
также проверить это ссылка он говорит, что он(f,e,g
) соответствует номеру с плавающей запятой.
C отображает как плавающие, так и двойные переменные до шести знаков после запятой. Это не относится к точности (точности), из которых число фактически хранится, только сколько десятичных знаков printf()
используется для отображения этих типах переменных.
следующая программа иллюстрирует, как объявляются и отображаются различные типы данных:
#include <stdio.h>
main()
{
float a = 23.567;
double b = 11e+23;
printf("Float variable is %f\n", a);
printf("Double variable is %e\n", b);
}
выход
Float variable is 23.567000
Double variable is 11.000000e23
%f: он печатает соответствующее число в виде десятичного числа с плавающей запятой, например 214.52
%e: он печатает число в научной нотации, например 214.52 e+2.
%g: он печатает соответствующее число в самом коротком из двух, например, в приведенных выше двух примерах, если я хочу напечатать число через %g, то это будет 214.52, но не 2.145 e+2, как это длиннее.
#include<stdio.h>
void main()
{
float f=12.5;
printf("%f\n",f);
printf("%e\n",f);
printf("%g\n",f);
}
выход:
12.500000
1.250000 e+001
12.5
%i=defaults for decimals
%u=gives the memory address of the variable
%p=gives the value of pointer
%e=gives the scientific notation
%g=handles large floating numbers