繁体   English   中英

如何在scanf之前清理缓冲区

[英]How to clean buffer before scanf

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

#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;
}

当我运行该程序时,它在第一个do循环中运行良好,但是在第二次开始循环时再次选择了选项之后,它并没有等我输入选择,而是直接打印“请输入半径”

当我调试程序时,我发现它第二次开始循环时选择了“ \\ n”,如何在每个循环中都删除该“ \\ n”? 我知道这个“ \\ n”是由于读取用户选择,然后是第一次运行循环而导致的,但是我不知道为什么选择项从选择项中删除而没有被删除?

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

有什么帮助吗? 提前致谢

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

使用摘要

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

在结束括号之前}do-while或之后第二个scanf

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM