#include <stdio.h>
void load_menu(void);
int main(void)
{
load_menu();
return 0;
}
void load_menu(void)
{
int choice;
int loopagain;
do
{
printf("Menu \n\n");
printf("Please enter your choice: \n");
printf("1. \n");
printf("2.\n");
printf("3.\n");
printf("4. Exit\n");
if (scanf("%d",&choice)==1)
{
switch(choice)
{
case 1:
break;
case 2:
break;
case 3:
break;
case 4: printf("Quitting program!\n");
break;
default: printf("Invalid choice! Please try again\n");
printf("\n");
break;
}
}
else
{
printf("Characters are invalid, please enter a number: \n ");
if (scanf("%d",&loopagain)==1)
load_menu();
}
}while((choice !=4));
}为什么当我输入一个字符时,它仍然会给我一个无限循环?这是一个菜单( case语句仍然需要填充),但我正在处理if语句输入的字符,但它似乎仍然不起作用。谢谢
发布于 2012-12-27 07:45:33
如果字符输入无效,则新调用的load_menu()中的loopagain将与其调用者中的不同。根本不要递归:
else
{
printf("Characters are invalid, please enter a number: \n ");
choice = 0; // Unused, so continue the loop
}发布于 2012-12-27 07:55:47
我认为,除了到目前为止发现的问题之外,有问题的“字母”被困在输入缓冲区中。当使用scanf读取数字时,只要命中任何不是白板和数字的数字,它就会停止。因此,如果缓冲区包含"a\n",并且我们调用了scanf("%d", ...),那么scanf将立即返回,并且会一直这样做,直到令人不快的'a‘从缓冲区中删除。
我们需要的是一个小循环来删除输入缓冲区中有问题的“垃圾”。
下面是前面提出问题(尽管刷新的原因略有不同,但解决方案是相同的):Question about flushing buffer
发布于 2012-12-27 07:53:47
在我看来,您对不正确输入的处理是没有意义的。我认为,这应该更像你的default:案例。正如其他人所说的,递归调用没有意义,当您要返回显示菜单并再次获取用户输入时,再次调用scanf进行输入也没有意义。
https://stackoverflow.com/questions/14047654
复制相似问题