给我一个无限循环的代码 #包括 无效加载菜单(无效); 内部主(空) { 加载菜单(); 返回0; } 无效加载菜单(无效) { 智力选择; 再次使用int; 做 { printf(“菜单\n\n”); printf(“请输入您的选择:\n”); printf(“1.\n”); printf(“2.\n”); printf(“3.\n”); printf(“4.退出\n”); if(scanf(“%d”,&choice)==1) { 开关(选择) { 案例1: 打破 案例2: 打破 案例3: 打破 案例4:printf(“退出计划!\n”); 打破 默认值:printf(“无效选择!请重试\n”); printf(“\n”); 打破 } } 其他的 { printf(“字符无效,请输入数字:\n”); if(scanf(“%d”,&loopreach)==1) 加载菜单(); } }而((选择!=4)); }
为什么当我输入一个字符时,这仍然会给我一个无限循环?它是一个菜单(case语句仍然需要填充),但我正在处理if语句输入的字符,但它似乎仍然不起作用。谢谢如果字符输入无效,则新调用的给我一个无限循环的代码 #包括 无效加载菜单(无效); 内部主(空) { 加载菜单(); 返回0; } 无效加载菜单(无效) { 智力选择; 再次使用int; 做 { printf(“菜单\n\n”); printf(“请输入您的选择:\n”); printf(“1.\n”); printf(“2.\n”); printf(“3.\n”); printf(“4.退出\n”); if(scanf(“%d”,&choice)==1) { 开关(选择) { 案例1: 打破 案例2: 打破 案例3: 打破 案例4:printf(“退出计划!\n”); 打破 默认值:printf(“无效选择!请重试\n”); printf(“\n”); 打破 } } 其他的 { printf(“字符无效,请输入数字:\n”); if(scanf(“%d”,&loopreach)==1) 加载菜单(); } }而((选择!=4)); },c,C,为什么当我输入一个字符时,这仍然会给我一个无限循环?它是一个菜单(case语句仍然需要填充),但我正在处理if语句输入的字符,但它似乎仍然不起作用。谢谢如果字符输入无效,则新调用的load_menu()中的循环将与其调用者中的循环不同。完全不要重复: #include <stdio.h> void load_menu(void); int main(void) { load_menu(); return 0; } void load_menu(void) { in
load_menu()
中的循环将与其调用者中的循环不同。完全不要重复:
#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));
}
如果字符输入无效,则新调用的load_menu()
中的循环将与其调用者中的循环不同。完全不要重复:
#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));
}
输入内容后,输入缓冲区不是数字,因此不被scanf(“%d”,&choice)接受。
不会刷新输入缓冲区。我相信在处理不可接受的输入时,您应该能够通过调用fflush(stdin)
来解决这个问题。更好的是,您可能会更好地在每次调用scanf之后刷新输入缓冲区
在我看来,你对错误输入的处理毫无意义。我认为,它应该更像您的默认值:
案例。正如其他人所说,递归调用没有意义,当您准备返回显示菜单并再次获取用户输入时,再次调用scanf进行输入也没有意义。在您输入某个内容后,该内容不是数字,因此scanf(“%d”,&choice)不接受。
输入缓冲区不会被刷新。我相信在处理不可接受的输入时,您应该能够通过调用fflush(stdin)
来解决这个问题。更好的是,您可能会更好地在每次调用scanf之后刷新输入缓冲区
在我看来,你对错误输入的处理毫无意义。我认为,它应该更像您的默认值:
案例。正如其他人所说的那样,递归调用没有意义,当您准备返回显示菜单并再次获取用户输入时,再次调用scanf进行输入也没有意义。我相信,除了目前发现的问题之外,有问题的“字母”卡在输入缓冲区中。当用scanf读取一个数字时,当它碰到任何非白板或非数字时,它就会停止。因此,如果缓冲区包含“a\n”,并且我们调用scanf(“%d”,…)
,那么scanf将立即返回,并将继续这样做,直到提供的“a”从缓冲区中删除为止
我们需要的是一个小循环,从输入缓冲区中删除令人讨厌的“垃圾”
这是之前提出的问题(尽管冲洗的原因略有不同,但解决方案是相同的):
我认为,除了目前发现的问题之外,还有一个问题,那就是违规的“字母”卡在了输入缓冲区中。当用scanf读取一个数字时,当它碰到任何非白板或非数字时,它就会停止。因此,如果缓冲区包含“a\n”,并且我们调用scanf(“%d”,…)
,那么scanf将立即返回,并将继续这样做,直到提供的“a”从缓冲区中删除为止
我们需要的是一个小循环,从输入缓冲区中删除令人讨厌的“垃圾”
这是之前提出的问题(尽管冲洗的原因略有不同,但解决方案是相同的):
我认为您的问题在于循环变量。根据名称,您将此变量视为循环与否的标志,以及管理第二个循环的方式。由于您是从标准文本(scanf)中读取它,您将失去对它的控制。
因为您的实现中已经有一个scanf,而且它是一个循环,所以您不需要递归调用,您可以始终使用相同的scanf,以正确的方式使用loopreach变量/标志。
更好的是,通过这种方式,没有字符的整数值是4(它永远不会通过scanf测试,值为1,但仍然…),此外EOT(ascii-cntr-D)是一种不常见的字符,您可以将其视为中断程序的另一种方法
一个解决方案是(我猜,根据我的解释):
#包括
无效加载菜单(无效);
内部主(空)
{
加载菜单();
返回0;
}
无效加载菜单(无效)
{
智力选择;
int=1;
做
{
如果(loopreach!=0){/*如果用户输入了一个“坏”数字,则将其设置为不同于0,这样菜单只打印一次*/
printf(“菜单\n\n”);
printf(“请输入您的选择:\n”);
printf(“1.\n”);
printf(“2.\n”);
printf(“3.\n”);
printf(“4.退出\n”);
}
if(scanf(“%d”,&choice)==1)
{
开关(选择)
{
案例1:
打破
案例2:
打破
案例3:
打破
案例4:printf(“退出计划!\n”);
打破
默认值:printf(“无效选择!
#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);
}