2014-09-02 51 views
0

下面的代码似乎给出了不一致的答案,而不是预期的结果,我不知道为什么。scanf with formatted float

$ cat chk.c 
#include <stdio.h> 

int main() 
{ 
     float a; 

     scanf("%4.1f", &a); 
     printf("%4.1f\n", a); 

     return 0; 
} 

$ cc chk.c && ./a.out 
12.1 
0.0 
$ 

这没有正确读取输入!任何人都可以解释这种行为吗?我在Linux上尝试了多个GCC版本,结果相同,并且网络搜索也没有用。

+2

精度不属于'scanf'格式规范的一部分。 – 2014-09-02 02:06:34

+1

第1步:将''\ n'放入'scanf(“%4f \ n”,&a);'这将处理第一个问题。 – chux 2014-09-02 02:07:20

回答

1

如果格式为scanf的空格,则表示读取所有字符,直到没有更多空白为止。为了做到这一点,它必须等到输入的内容不是空白时才显示,就好像它要求你输入多个值。使用"\n"并不意味着读取单个换行符,它表示读取全部为空格。

printf格式字符串不同,精度不是scanf格式字符串的一部分,所以scanf仅仅是无法读取第二个示例中的float值。您最终打印一个未初始化的值,这发生在打印0.0。获取未初始化变量的值是未定义的行为,所以它可以做任何事情。