'计算电路的面积和周长'程序在c ...奇怪的输出

时间:2014-01-07 14:33:11

标签: c switch-statement scanf

我正在制作这个程序,要求用户输入电路的半径,然后让他们选择他想要计算的东西:面积,周长或圆柱体积。

#include <stdio.h>

int main(void)
{
float radius=0.0,height=0.0;
char choice,quit;
const float pi=3.1415658;

do
{
printf("Enter radius : \n");
scanf("%f",&radius);

printf("\n\nWhat do you want to calc.?\nArea of circuit --> press A\n"
"Circumference of circuit --> press C\nVolume of cylinder --> press V\nQuit --> Q\n");

scanf("%c",&choice);

switch (choice)
{
case 'A':
   printf("Area = %.5f\n",radius*radius*pi);
   break;
case 'C':
   printf("Circumference = %.5f\n",2*radius*pi);
   break;
case 'V':
    printf("Enter Hight : \n");
    scanf("%f",&height);
   printf("Volume of cylinder = %.5f\n",radius*radius*pi*height);
   break;
case 'Q':
    quit='y';
   break;
default:
    printf("default!!\n");
   break;
}
}while(quit != 'y');

return 0;
}

但是当我运行程序时

Enter radius :
3

What do you want to calc.?
Area of circuit --> press A
Circumference of circuit --> press C
Volume of cylinder --> press V
Quit --> Q
/*here before I choose anything the next line appears, skipping reading the choice*/
default!!
Enter radius :

那么为什么它会跳过阅读用户的选择并直接跳转到默认值? 有什么问题??

1 个答案:

答案 0 :(得分:3)

这是因为当您使用scanf读取半径时,您按下以结束该输入的换行符仍在输入缓冲区中。因此,当您稍后使用scanf读取字符时,它会读取该换行符。

简单的解决方案是告诉后者scanf跳过任何前导空格。这是通过向scanf格式代码添加空格来完成的:

scanf(" %c", &choice);
/*     ^           */
/*     |           */
/* Note space here */