读取双倍时的scanf问题

时间:2015-06-18 14:12:13

标签: c gcc double user-input scanf

我在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

2 个答案:

答案 0 :(得分:4)

在您的代码中,更改

  scanf("%lf \n", &radius);

  scanf("%lf", &radius);

否则,对于格式字符串whitespacescanf()的行为如下(引自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中包含空格

程序将一直等到您在其中输入空格或任何其他值,因此程序将继续正常,但无论如何都不会使用您输入的空格或任何值。