[英]Infinite error loop with if/else statement in a while loop
我正在嘗試制作一個具有 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;
}
}
'a' 例如,它會導致無限循環”
'a'
永遠不會被if(scanf("%i", &option) == 1){
使用。 它不是數字文本,因此會放回標准輸入以用於下一個輸入stdin
由於scanf("%i", &option)
if then 再次調用,結果重復。
代碼需要讀取和使用'a'
。 考慮fgets()
。
最好完全避免使用scanf()
,直到您了解它為什么不好。
根據您的代碼,在此代碼中scanf("%i", &option)
期望使用端的整數值。 當用戶輸入非整數值時, scanf
function 不會在選項變量中存儲任何內容。 使用fgets
fgets
function 從指定文件或控制台讀取文本行或字符串。 然后將其存儲到相應的字符串變量中。
嘗試按如下方式更新您的代碼:
char input[10];
while (!exit) {
printf("Choose an option:");
printf("1. Eliminate.");
printf("2. Show fraction.");
.
.
.
fgets(input, sizeof(input), stdin);
if (sscanf(input, "%i", &option) == 1) {
if (RESTRICT(option, 0, 12)) {
switch (option) {
case 1:
printf("Example");
break;
case 2:
printf("Example");
break;
.
.
.
}
} else if (option == 12) {
printf("\nGoodbye!\n");
exit = 1;
} else {
printf("\nThat is not an option! Try again\n");
continue;
}
} else {
printf("\nThat is not an option! Try again\n");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.