繁体   English   中英

在 while 循环中使用 if/else 语句的无限错误循环

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM