C语言中导致无限循环的字符项
好的,我已经在几个地方搜索了这个问题的答案,我在C语言中导致无限循环的字符项,c,infinite-loop,C,Infinite Loop,好的,我已经在几个地方搜索了这个问题的答案,我在C++中找到了相同问题的答案,但是它涉及到清除cin和那些东西,我不知道如何将其翻译成C。事实上,如果这是其他地方的回答,而我只是错过了,我提前道歉。另外,请记住,我基本上是在自学C,除了在这段代码中看到的内容之外,我知道的不多 基本上,我的问题是:我正在运行一个循环,该循环要求输入,然后使用switch语句来选择发生了什么。开关接受一个int,它可以与任何数字输入一起正常工作。然而,当您输入一个字符时,它只是无限循环,没有机会输入任何其他内容 假
C++
中找到了相同问题的答案,但是它涉及到清除cin
和那些东西,我不知道如何将其翻译成C
。事实上,如果这是其他地方的回答,而我只是错过了,我提前道歉。另外,请记住,我基本上是在自学C
,除了在这段代码中看到的内容之外,我知道的不多
基本上,我的问题是:我正在运行一个循环,该循环要求输入,然后使用switch
语句来选择发生了什么。开关
接受一个int
,它可以与任何数字输入一起正常工作。然而,当您输入一个字符时,它只是无限循环,没有机会输入任何其他内容
假设这与我查找的C++
示例中的问题相同,但我不是100%确定,当我输入char
时,它会被添加到缓冲区中,并且永远不会被清除,因此每次循环时,无效输入都会被再次使用。在C++
中清除缓冲区似乎很简单,但在C
中我找不到任何我能理解的东西
这是我的代码,供参考:
int main()
{
while(1)
{
printf("(1-10) -> Run a program | (-1) -> Display menu | (0) -> Quit : ");
int quit = 0;
int select;
scanf("%d", &select);
switch(select)
{
case 1:
printf("%s", pgmRun);
helloWorld();
printf("%s", pgmEnd);
break;
//More cases here
case 0:
quit = 1;
break;
default:
printf("\n");
printf("Error: Invalid input\n");
printf("\n");
}
if(quit == 1)
break;
}
return 0;
}
提前感谢您的帮助,并为这么长的帖子感到抱歉。我总是唠叨个没完Pfflush(stdin)
具有未定义的行为。如果要丢弃在scanf()调用后输入的字符,可以读取并丢弃它们。
您可以使用getchar()
清除字符。我建议您,尤其是检查它返回的内容。我会调查一下,谢谢。@Floris从技术上讲,fflush(stdin)
是未定义的行为。并非所有库都支持它。也许在换行前获得角色会更好。谢谢大家的建议。你是对的;我太快了,应该测试一下我的建议。为了完整性,我建议您编辑您的答案,以显示如何使用getchar()
——例如使用while(scanf(“%d”,&select)!=1)getchar()
。我所做的是在switch
语句后的循环中插入getchar()
。或者,阅读直到得到\n
或EOF
,在许多情况下,如果当前行有垃圾,丢弃行的其余部分更有意义。