gpt4 book ai didi

c - 在 while 循环中使用 getchar(),打印一条语句两次……如何?

转载 作者:太空狗 更新时间:2023-10-29 15:24:17 24 4
gpt4 key购买 nike

我有一个像这样的非常简单的程序

int main()
{
int opt;
int n;
int flag = 1;
while(flag)
{
printf("m inside while.Press c to continue\n");
if((opt = getchar())== 'c')
{
printf("choose a number\n");
scanf(" %d",&n);
switch(n)
{
case 0:
printf("m zero\n");
break;
case 1:
printf("entered one\n");
break;
case 3:
printf("m exit\n");
flag = 0;
break;
}
printf("m broke\n");
}
}
printf("m out\n");
return 0;
}

我得到这样的输出:

m inside while.Press c to continue
c
choose a number
1
entered one
m broke
m inside while.Press c to continue
m inside while.Press c to continue
c
choose a number

我的疑问是为什么“m inside while.Press c to continue”在每次循环后打印两次??

提前致谢

最佳答案

这是因为之前的scanf留下了\n字符。当您输入一个数字并按下 Enter 键时,一个额外的 \n 字符会传递到标准输入缓冲区。 scanf 读取缓冲区中留下 \n 的 nuber。在循环的下一次迭代中,getchar 在您按下任何字符之前读取 \n,因此 m 在 while 内。Press c to continue 打印两次 \n 不是 c
将这段代码放在 while 循环中的 scanf 语句之后,以吃掉换行符

while(getchar() != '\n');  

这会吃掉任意数量的 \n
有关 getchar 行为的更详细解释,请阅读 this answer .
你的最终代码应该是

 int main()
{
int opt;
int n;
int flag = 1;
while(flag)
{
printf("m inside while.Press c to continue\n");
if((opt = getchar())== 'c')
{
printf("choose a number\n");
scanf(" %d",&n);
while(getchar() != '\n');
switch(n)
{
case 0:
printf("m zero\n");
break;
case 1:
printf("entered one\n");
break;
case 3:
printf("m exit\n");
flag = 0;
break;
}
printf("m broke\n");
}
}
printf("m out\n");
return 0;
}

关于c - 在 while 循环中使用 getchar(),打印一条语句两次……如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20801854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com