如何在scanf之前清理缓冲区

时间:2014-01-10 13:09:16

标签: c scanf getchar

我正在编写程序代码,该程序从用户读取输入选项并根据其计算(面积,周长,体积或退出)

#include<stdio.h>

int main(void)
{
    double radius=0.0;
    double area=0.0;
    double volume=0.0;
    double height=0.0;
    double circumference=0.0;
    const double pi=13.459820934;

    char choice;

    do
    {
    printf("Choose what you want to do : \n"
           "Calculate Area          A\n"
           "Calculate Circumference C\n"
           "Calculate Volume        V\n"
           "Quit                    Q\n");
    /*scanf("%c",&choice);*/
    choice=getchar();

    printf("please enter radius : ");
    scanf("%lf",&radius);

    if(choice=='V')
    {
        printf("please enter height : ");
        scanf("%lf",&height);
    }

    area = pi * radius * radius;
    volume = height * area;
    circumference = 2 * pi * radius;

    switch (choice)
    {
    case 'A':
        printf("Area = %lf\n\n",area);
        break;
    case 'V':
        printf("Volume = %lf\n\n",volume);
        break;
    case 'C':
        printf("Circumference = %lf\n\n",circumference);
        break;
    default:
        printf("Not a good answer !!\n\n");
    }
    }while(choice!='Q');

return 0;
}

当我运行该程序时,它适用于第一次执行循环但是在第二次开始循环后再次选择选项时,它没有等待我输入我的选择,它直接打印“请输入半径“

当我调试程序时,我发现在第二次开始循环时有选择'\ n',如何在每个循环中删除'\ n'? 我知道这个'\ n'来自于第一次循环运行时读取用户选择,但我不知道为什么选择从选择中移除而不是?

我在向用户显示选项之前尝试初始化选择但发生了同样的问题

有什么帮助吗? 提前谢谢

1 个答案:

答案 0 :(得分:1)

Enter 键后,\n调用留下scanf个字符。您需要在下一次迭代之前使用此\n,否则此\n字符将由下一个scanfgetchar读取。

使用代码段

int ch;
while((ch = getchar()) != EOF || ch != '\n');

}的右大括号do-while之前或第二scanf之后。