在C语言中,有机会在%a
格式字符串内实现scanf()
作为格式说明符,以对浮点值进行格式化。
赞:
float v;
scanf("%a",&v);
在C标准(我的关系尤其是ISO / IEC 9899/2011(C11))中,仅对该特定说明符进行了较少的解释,而与%f
的关联浮点转换说明符没有什么不同, %e
和%g
:
引用,ISO / IEC 9899/2011,§7.21.6.2:
a,e,f,g-匹配一个可选的带符号浮点数,无穷大或NaN,其格式与strtod函数的主题序列所期望的格式相同。相应的参数应为指向“浮动”的指针。
此说明符是什么,其预期用途是什么? 与其他浮点转换说明符有何特殊区别?
答案 0 :(得分:3)
%a
的{{1}},%e
,%f
和%g
格式说明符都执行与标准引用的段落相同的转换
scanf
的Linux手册页对其进行了更明确的拼写:
f匹配一个可选的带符号浮点数;下一个 指针必须是要浮动的指针。
e等同于f。
g等同于f。
E等同于f。
a(C99)等同于f。
之所以存在这些内容,是因为它们也是scanf
格式说明符,它们接受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;
}