以下代码似乎给出了不一致的答案而不是预期的结果,我想知道为什么。
$ 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版本,结果相同,网络搜索也没用。
答案 0 :(得分:1)
如果您有scanf
格式的空格,则表示在没有空格之前读取所有字符。为了做到这一点,它必须等到你输入不是空格的东西,所以它似乎要求你输入多个值。使用"\n"
并不意味着读取单个换行符,这意味着读取所有空格。
与printf
格式字符串不同,precision不是scanf
格式字符串的一部分,因此scanf
在第二个示例中无法读取浮点数。您最终打印出未初始化的值,恰好打印0.0
。获取未初始化变量的值是未定义的行为,因此它可以做任何事情。