Все спецификаторы формата %a
, %e
, %f
и %g
в scanf
выполняют то же преобразование, что указано в цитируемом отрывке из стандарта.
На справочной странице Linux для scanf
об этом говорится более подробно:
f Соответствует необязательному числу с плавающей запятой со знаком; следующий указатель должен быть указателем с плавающей запятой.
е Эквивалент f.
г Эквивалент f.
E Эквивалент f.
a (C99) Эквивалент f.
Предположительно, они присутствуют, потому что они также являются спецификаторами формата printf
, которые принимают float
, но, в отличие от scanf
, отличаются выводом, который они производят.
Чтобы проиллюстрировать это, следующий код:
#include <stdio.h>
int main()
{
char *str[] = { "234.56", "2.3456e2", "2.3456E2", "0x1.d51eb8p+7" };
unsigned i;
for (i=0; i<sizeof(str)/sizeof(*str); i++) {
float f;
printf("scanning %s\n", str[i]);
sscanf(str[i], "%f", &f);
printf("scanned with f: (f)%f, (e)%e, (g)%g, (a)%a\n", f, f, f, f);
sscanf(str[i], "%g", &f);
printf("scanned with g: (f)%f, (e)%e, (g)%g, (a)%a\n", f, f, f, f);
sscanf(str[i], "%e", &f);
printf("scanned with e: (f)%f, (e)%e, (g)%g, (a)%a\n", f, f, f, f);
sscanf(str[i], "%a", &f);
printf("scanned with a: (f)%f, (e)%e, (g)%g, (a)%a\n", f, f, f, f);
}
return 0;
}
Выходы:
scanning 234.56
scanned with f: (f)234.559998, (e)2.345600e+02, (g)234.56, (a)0x1.d51eb8p+7
scanned with g: (f)234.559998, (e)2.345600e+02, (g)234.56, (a)0x1.d51eb8p+7
scanned with e: (f)234.559998, (e)2.345600e+02, (g)234.56, (a)0x1.d51eb8p+7
scanned with a: (f)234.559998, (e)2.345600e+02, (g)234.56, (a)0x1.d51eb8p+7
scanning 2.3456e2
scanned with f: (f)234.559998, (e)2.345600e+02, (g)234.56, (a)0x1.d51eb8p+7
scanned with g: (f)234.559998, (e)2.345600e+02, (g)234.56, (a)0x1.d51eb8p+7
scanned with e: (f)234.559998, (e)2.345600e+02, (g)234.56, (a)0x1.d51eb8p+7
scanned with a: (f)234.559998, (e)2.345600e+02, (g)234.56, (a)0x1.d51eb8p+7
scanning 2.3456E2
scanned with f: (f)234.559998, (e)2.345600e+02, (g)234.56, (a)0x1.d51eb8p+7
scanned with g: (f)234.559998, (e)2.345600e+02, (g)234.56, (a)0x1.d51eb8p+7
scanned with e: (f)234.559998, (e)2.345600e+02, (g)234.56, (a)0x1.d51eb8p+7
scanned with a: (f)234.559998, (e)2.345600e+02, (g)234.56, (a)0x1.d51eb8p+7
scanning 0x1.d51eb8p+7
scanned with f: (f)234.559998, (e)2.345600e+02, (g)234.56, (a)0x1.d51eb8p+7
scanned with g: (f)234.559998, (e)2.345600e+02, (g)234.56, (a)0x1.d51eb8p+7
scanned with e: (f)234.559998, (e)2.345600e+02, (g)234.56, (a)0x1.d51eb8p+7
scanned with a: (f)234.559998, (e)2.345600e+02, (g)234.56, (a)0x1.d51eb8p+7
person
dbush
schedule
20.12.2019
"%a"
) позволяет вводить числа с плавающей запятой в шестнадцатеричном формате: немного не так. Ввод с плавающей запятой в шестнадцатеричном формате разрешен C99, но работает для%a, %A, %e, %E, %f, %F, %g, %G, %la, %lA, %le, %lE, ... %LG
- person chux - Reinstate Monica   schedule 20.12.2019