我在Windows 7上使用MinGW来编译C文件。
我的问题是scanf()
从用户输入中读取double
的奇怪行为。
我的代码:
int main() {
double radius = 0;
double pi = 3.14159;
scanf("%lf \n", &radius); // after the input, it continues waiting...
radius = ((radius * radius) * pi);
printf("A=%.4lf\n", radius);
return 0;
}
当我运行这个程序时,必须输入一个值,假设100.64
,正常的行为是按回车,程序应该继续并显示结果,但程序仍在等待更多的输入。如果我输入0并再次按回车键,程序将继续正常。
>area.exe
100.64 <-- doesn't proceed after press enter
0 <-- needs input another value, then press enter
A=31819.3103 <-- the result
为什么scanf不进行第一次输入?为什么需要更多?
Obs:在我的Linux中,这不会发生。
gcc --version
gcc (tdm64-1) 4.9.2
答案 0 :(得分:4)
在您的代码中,更改
scanf("%lf \n", &radius);
到
scanf("%lf", &radius);
否则,对于格式字符串whitespace
,scanf()
的行为如下(引自C11
,第§7.21.6.2
章,第5段)
由空白字符组成的指令通过读取第一个非空白字符(仍然未读取)的输入来执行,或者直到不再能够读取字符为止。
因此,要提供“非空白字符”来结束扫描,您需要输入0
(基本上是非空白字符)。
请查看man page了解详情。
答案 1 :(得分:0)
对于稍微不同的问题(仅在变量类型中)你有相同的解决方案
Why does scanf ask for input twice, but just in the first loop iteration only?
在scanf中包含空格
程序将一直等到您在其中输入空格或任何其他值,因此程序将继续正常,但无论如何都不会使用您输入的空格或任何值。