Есть ли разница в использовании %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