我尝试制作一个有12个操作的计算器,第12个是退出,如果用户尝试输入1-12以外的值,我希望它产生一个错误消息。
我让它工作的数字,如15,500等,不在范围内,但如果用户输入字母'a',例如,它会导致一个无限循环,而如果用户输入500它做什么,我希望它,这是打印“重试”消息,并再次显示菜单。
所以,我知道问题出在while循环中直接包含的if/else循环上,但是我不确定为什么它在break之后不返回菜单; else语句中包含“red”的语句(我把红色和蓝色放进去,这样我就可以分辨出正在打印的是哪条语句)。我尝试了一个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;
}
}
2条答案
按热度按时间wkyowqbh1#
例如'a',它会导致无限循环”
'a'
不会被if(scanf("%i", &option) == 1){
使用。它不是数字文本,因此会放回stdin
中以用于下一个输入函数。由于scanf("%i", &option)
如果再次调用,结果会重复。代码需要读取和使用
'a'
。请考虑fgets()
。最好避免使用
scanf()
,直到你明白它为什么不好。wkftcu5l2#
根据您的代码,在此代码中
scanf("%i", &option)
期望整数值从使用端。当用户输入非整数值,scanf
函数将不会存储任何东西在选项变量。使用fgets
fgets
函数从指定的文件或控制台读取文本行或字符串。然后将其存储到相应的字符串变量。请尝试按如下方式更新代码: