【发布时间】:2022-12-31 23:06:30
【问题描述】:
我正在尝试制作一个具有 12 个操作的计算器,第 12 个是退出,如果用户尝试输入 1-12 以外的值,我希望它产生一条错误消息。
我让它适用于不在范围内的数字,如 15、500 等,但是如果用户输入字母“a”,它会导致无限循环,而如果用户输入 500,它会我想要的是打印“再试一次”消息并再次显示菜单。
所以,我知道问题出在 while 循环中直接包含的 if/else 循环,但我不确定为什么它在中断后不返回菜单;包含“红色”的 else 语句中的语句(我把红色和蓝色放在一起,这样我就可以知道正在打印哪个语句)。我尝试了一个 do/while 循环,但遇到了同样的问题。我还尝试将 switch case 中的默认语句设为“再试一次”部分,如果用户输入像 500 这样的数字,它会起作用,但只要输入像 ? 这样的字母或字符,它就会起作用。输入后,我得到一个无限的“再试一次”循环。
这是我遇到问题的代码:
#define RESTRICT(option, min, max) (option > min && option < max)
while(!exit) {
printf("Choose an option:");
printf("1. Eliminate.");
printf("2. Show fraction.");
printf("3. Show all fractions.");
printf("4. Show the absolute value.");
printf("5. Simplify.");
printf("6. Add.");
printf("7. Subtract.");
printf("8. Multiply.");
printf("9. Divide.");
printf("10. Save in archive.");
printf("11. Load in archive.");
printf("12. Exit program.");
if(scanf("%i", &option) == 1){
if(RESTRICT(option,0,12)){
switch(option){
case 1:
printf("Example");
break;
case 2:
printf("Example");
break;
case 3:
printf("Example");
break;
case 4:
printf("Example");
break;
case 5:
printf("Example");
break;
case 6:
printf("Example");
break;
case 7:
printf("Example");
break;
case 8:
printf("Example");
break;
case 9:
printf("Example");
break;
case 10:
printf("Example");
break;
case 11:
printf("Example");
break;
}
} else if (option==12){
printf("\nGoodbye!\n");
exit=1;
} else {
printf("\nThat is not an option! Try again\n");
printf("\nBlue\n");
continue;
}
} else {
printf("\nThat is not an option! Try again\n");
printf("\nRed\n");
break;
}
}
【问题讨论】:
-
但是如果我不包括 0 那么选项就不能是 1,那么情况 1 永远不会被选择,对吧?
-
没关系,你的
RESTRICT排除了两个界限,我草率地读了。 -
真正的问题是您没有检查
scanf的返回值。 -
没关系,我刚刚意识到我也将其设置为 break;所以在这种情况下,它实际上只是在我真的希望它返回菜单并再次打印它时关闭程序,以便用户可以重试。不知道该怎么做...
-
@LMD
if(scanf("%i", &option) == 1){正在检查返回值
标签: c infinite-loop