C 如何在扫描前清理缓冲区

C 如何在扫描前清理缓冲区,c,scanf,getchar,C,Scanf,Getchar,我正在编写一个程序的代码,从用户那里读取输入选项,并根据它的计算结果(面积、周长、体积或面积) #包括 内部主(空) { 双半径=0.0; 双面积=0.0; 双体积=0.0; 双倍高度=0.0; 双周长=0.0; 常数双pi=13.459820934; 字符选择; 做 { printf(“选择要执行的操作:\n” “计算面积A\n” “计算周长C\n” “计算卷V\n” “退出Q\n”); /*scanf(“%c”,选择(&c))*/ choice=getchar(); printf(“请输入半

我正在编写一个程序的代码,从用户那里读取输入选项,并根据它的计算结果(面积、周长、体积或面积)

#包括
内部主(空)
{
双半径=0.0;
双面积=0.0;
双体积=0.0;
双倍高度=0.0;
双周长=0.0;
常数双pi=13.459820934;
字符选择;
做
{
printf(“选择要执行的操作:\n”
“计算面积A\n”
“计算周长C\n”
“计算卷V\n”
“退出Q\n”);
/*scanf(“%c”,选择(&c))*/
choice=getchar();
printf(“请输入半径:”);
扫描频率(“%lf”、&radius);
如果(选项=='V')
{
printf(“请输入高度:”);
扫描频率(“%lf”和高度);
}
面积=圆周率*半径*半径;
体积=高度*面积;
周长=2*pi*半径;
开关(选择)
{
案例“A”:
printf(“区域=%lf\n\n”,区域);
打破
案例“V”:
printf(“卷=%lf\n\n”,卷);
打破
案例“C”:
printf(“周长=%lf\n\n”,周长);
打破
违约:
printf(“不是一个好答案!!\n\n”);
}
}while(choice!='Q');
返回0;
}
当我运行程序时,它在第一个do循环中运行良好,但在第二次循环开始时再次弹出选择后,它没有等待我输入选择,而是直接打印“请输入半径”

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

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

需要帮忙吗?
提前感谢

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

使用代码片段

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

就在
的右大括号
}
之前或第二个
scanf
之后

“你能告诉我它是干什么用的吗?”萨拉赫丁;更新了答案。while(getchar()!='\n');我使用了这个代码段,它的工作原理是,用户输入的任何输入后面都跟有“\n”,因此输入本身从缓冲区读取并放入一个变量(她的选择)中,但“\n”留在缓冲区中,因此我们必须假装再次读取输入来读取这个“\n”并清理缓冲区,这是while的功能(getchar()!='\n');如果我是对的,为什么不使用输入本身读取“\n”并将其放入变量中?为什么它落在后面是的,你是对的<由于
%lf
需要一个
double
类型的参数,因此
scanf
无法读取code>\n
。它可以跳过大量的空格(制表符、空格、新行等);仅用于删除空白和“\n”?的可能重复项
int ch;
while((ch = getchar()) != EOF || ch != '\n');