我遇到这个问题时菜单循环是一个更大的编程问题的一部分,它不断重复任何非数字输入。我怎么能阻止这个? 任何帮助都会非常感谢!
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main (void)
{
int option = 0;
do
{
printf("--- Menu---\n1) Option 1\n2) Option 2\n3) Option 3\n4) Exit\nPlease select an option (1, 2, 3, or 4):");
if ((scanf("%d", &option) != 1))
{
printf(">Invalid option! ");
}
switch(option)
{
case 1: printf(" 1 \n");
break ;
case 2:printf(" 2 \n");
break ;
case 3: printf(" 3 \n");
break ;
case 4: printf(" The program has terminated\n");
break;
}
}while(option != 4);
return 0;
}
答案 0 :(得分:3)
它不断重复的原因是因为
scanf("%d", &option)
输入非数字输入时,将返回0。 scanf
失败但确实失败了
不清理输入缓冲区,这意味着非数字输入将保留
输入缓冲区。
因为你没有在错误中退出循环
if ((scanf("%d", &option) != 1))
{
printf(">Invalid option! ");
}
scanf
将再次尝试阅读stdin
。但由于以前的失败,
输入缓冲区仍将具有最后的非数字输入,scanf
将失败
再一次,等等。因此它不断重复。
你必须在循环中出错:
if ((scanf("%d", &option) != 1))
{
printf(">Invalid option! ");
break;
}
将结束该计划。但是,如果你不希望程序结束但打印 菜单并等待用户输入,然后你必须&#34;清洁&#34;输入缓冲区。您 可以使用这个功能:
void clean_stdin(void)
{
int c;
while((c = getchar()) != '\n' && c != EOF);
}
然后
if ((scanf("%d", &option) != 1))
{
printf(">Invalid option! ");
clean_stdin();
continue; // to skip the rest of the loop
// and start the loop again
}