Scanf()-什么是%a格式/转换说明符?

时间:2019-12-20 16:08:29

标签: c floating-point formatting scanf format-specifiers

在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函数的主题序列所期望的格式相同。相应的参数应为指向“浮动”的指针。

此说明符是什么,其预期用途是什么? 与其他浮点转换说明符有何特殊区别?

1 个答案:

答案 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;
}