无限循环 Do While

Infinite loop Do While

我正在尝试创建一个程序,在开始时它向用户显示一个菜单,其中包含一个 do{ ... }while;它读取一个 int.,里面有一个开关。

它完美地读取和检查整数,问题是在写入字符或字符串时,它会陷入无限循环,显示 switch 循环的默认消息。代码如下:

int op;
printf("Choose an option:\n 1. option 1\n 2. option 2\n 3. option 3\n");
do{
    scanf("%d", &op);
    switch(op){
        case 1: (instruction); break;
        case 2: (instruction); break;
        case 3: (instruction); break;
        default: printf("\nPlease enter a valid option\n");
    }
}while(op<1 || op>3);

It works perfectly to read and check the integer, the problem is when writing a character or string, which gets stuck in an infinite loop showing the default message of the switch loop.

scanf("%d", &op); 当输入不是有效的 int 时什么都不做,你需要检查 return 值是否为 1,如果不是,则决定要做什么,例如读取字符串或刷新直到行尾,还管理 EOF 案例

注意以防 scanf 什么都不做 op 未设置

也可以:

int op;
printf("Choose an option:\n 1. option 1\n 2. option 2\n 3. option 3\n");
do{
    if (scanf("%d", &op) != 1) {
       // flush all the line
       while ((op = getchar()) != '\n') {
         if (c == EOF) {
           puts("EOF, abort");
           exit(0); /* what you want */
         }
       }
       op = -1; /* invalid value */
     }
     switch(op){
        case 1: (instruction); break;
        case 2: (instruction); break;
        case 3: (instruction); break;
        default: puts("\nPlease enter a valid option");
       }
    }           
}while(op<1 || op>3);

我鼓励你从不相信一个输入并且总是检查return值scanf等等

%d 转换说明符仅查找十进制输入。消耗字符或字符串不起作用。如果你输入一个字符而不是一个十进制值,该指令将失败,并且因为 op 没有初始化你有 undefined behavior.

要使用 scanf() 捕获字符串,请使用 %s 转换说明符或使用 fgets()。对于只捕获一个字符,请使用 %c 转换说明符和 scanf().