#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));
}
为什么当我输入一个角色时,这仍然给我一个无限循环?这是一个菜单(案例陈述仍然需要填写),但我正在处理if语句输入的字符,但它似乎仍然无法正常工作。感谢
答案 0 :(得分:4)
如果字符输入无效,则新调用的loopagain
中的load_menu()
将与其调用者中的else
{
printf("Characters are invalid, please enter a number: \n ");
choice = 0; // Unused, so continue the loop
}
不同。根本不要递归:
{{1}}
答案 1 :(得分:1)
我相信,除了目前发现的问题之外,有问题的“字母”卡在输入缓冲区中。使用scanf读取数字时,只要它击中任何不是白色的数字而不是数字,它就会停止。因此,如果缓冲区包含“a \ n”,并且我们调用scanf("%d", ...)
,则scanf将返回immediatelty,并将继续这样做,直到从缓冲区中移除了“a”。
我们需要的是一个小循环来从输入缓冲区中删除有问题的“垃圾”。
这是之前提出的问题(尽管冲洗的原因略有不同,解决方案是相同的): Question about flushing buffer
答案 2 :(得分:0)
输入的内容不是数字,因此scanf("%d",&choice)
不接受输入缓冲区未刷新。我相信在处理不可接受的输入时,您应该能够通过调用fflush(stdin)
来解决此问题。更好的是,每次调用scanf后,你可能会更好地刷新输入缓冲区。
在我看来,你对错误输入的处理没有意义。我认为它应该更像你的default:
案件。正如其他人所说的那样,递归调用没有意义,当你要回到显示菜单并再次获得用户输入时,也不会再次调用scanf。
答案 3 :(得分:0)
我认为你的问题是loopagain变量。通过名称,你正在考虑这个变量,就像一个标志循环或不再循环,并管理你的第二个循环的方式。由于你是从stdin(scanf)读取它,你将失去对它的控制。 由于你的实现中已经有一个scanf,因为它是一个循环,你不需要递归调用,你可以使用loopagain变量/ flag以正确的方式使用相同的scanf。 更好的是,通过这种方式,除了EOT(ascii - cntr-D)之外,没有其整数值为4的字符(它永远不会通过值为1的scanf测试,但仍然......)常见的,您可以将其视为打破计划的另一种方式。
这是一个解决方案(我想,根据我的解释):
#include <stdio.h>
void load_menu(void);
int main(void)
{
load_menu();
return 0;
}
void load_menu(void)
{
int choice;
int loopagain = 1;
do
{
if(loopagain != 0){ /*You'll set it to different from 0 if the user entered a 'bad' number so the menu is only printed once*/
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");
loopagain = 0;
printf("\n");
break;
}
}else{
printf("Characters are invalid, please enter a number: \n ");
loopagain = 0;
}
}while(choice !=4);
}
希望它有所帮助。