使用%f、%e、%g、%e或%g与scanf有什么区别吗?

使用%f、%e、%g、%e或%g与scanf有什么区别吗?,c,floating-point,scanf,C,Floating Point,Scanf,在C语言中,当使用scanf读入浮点变量时,格式说明符%f、%e、%g、%e和%g有什么不同吗?也就是说,代码片段的行为 float x; scanf("%<one of f, e, g, E, G>", &x); float x; 扫描频率(“%”,&x); 是否依赖于说明符的选择 我首先假设%f只能正确解释十进制表示法,%e只能正确解释科学表示法,但在我的系统中,无论哪种情况,它们都可以正常工作。但也许我的制度是自由的 我在我的书或网上找不到任何关于这个的明确声明…f

在C语言中,当使用scanf读入浮点变量时,格式说明符%f、%e、%g、%e和%g有什么不同吗?也就是说,代码片段的行为

float x;
scanf("%<one of f, e, g, E, G>", &x);
float x;
扫描频率(“%”,&x);
是否依赖于说明符的选择

我首先假设%f只能正确解释十进制表示法,%e只能正确解释科学表示法,但在我的系统中,无论哪种情况,它们都可以正常工作。但也许我的制度是自由的


我在我的书或网上找不到任何关于这个的明确声明…

f,e,g
都是浮点数

从:-

一系列十进制数字,可选择包含小数点, 可选地以符号(+或-)开头,可选地后跟 e或e字符和十进制整数(或某些其他序列 由strod支持)。符合C99的实现也支持 后跟0x或0x的十六进制浮点格式


也检查它,它(代码> f,e,g< /Cube >)与浮点数匹配。< /P> < P>以上回答是C++,但C.</P>也是如此。 从中的“7.19.6.2 fscanf功能”(链接复制自):

a、e、f、g
匹配可选的有符号浮点数,无穷大, 或NaN,其格式与主题序列的预期格式相同 strtod函数的一个实例。相应的参数应为指针 漂浮

转换说明符A、E、F、G、X也有效且有效 行为分别与a、e、f、g、和x相同


因此,
%f、%e、%g、%e、%g
在扫描数字时的行为都是相同的,正如您所经历的那样。

C将浮点变量和双变量显示为小数点后六位。这并不是指数字实际存储的精度(精度),而是指
printf()
用于显示这些变量类型的小数位数

%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
以下程序说明了如何声明和显示不同的数据类型:

#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);
}

%f
将数字打印为十进制浮点数,例如214.52<代码>%e以科学记数法打印数字,例如214.52e+2
%g
打印两个数字中最短的一个,例如,在上面的两个示例中,如果我想通过%g打印数字,那么它将是214.52,而不是2.145e+2,因为它更长

#include<stdio.h>
int main(int argc, char *argv[]) {
    float f=214.52;   
    printf("%f\n",f); // 214.520004
    printf("%e\n",f); // 2.145200e+02
    printf("%g\n",f); // 214.52
}
#包括
int main(int argc,char*argv[]){
浮点数f=214.52;
printf(“%f\n”,f);//214.520004
printf(“%e\n”,f);//2.145200e+02
printf(“%g\n”,f);//214.52
}

基于@Sameer Sharma answer

$ cat test.c 
#include<stdio.h>
void main()
{

float f=12.5123;

    printf("%f\n",f);
    printf("%e\n",f);
    printf("%g\n",f);
}


你可能想读,谢谢。这个参考是C++的,这就是我之前没有完全信任它的原因。现在编辑我的问题,为的POSIX页面添加“C”反映了C标准,并添加了一些(仔细标记的)扩展。它表示转换说明符
a
e
f
g
a
e
f
g
都处理任何格式的浮点数。始终接受指数(但从不要求)。小数点可以接受,但不是必需的。打印它们怎么样?
$ cat test.c 
#include<stdio.h>
void main()
{

float f=12.5123;

    printf("%f\n",f);
    printf("%e\n",f);
    printf("%g\n",f);
}

$ gcc test.c
$ ./a.out
12.512300
1.251230e+01
12.5123