C - 当输入不是 int 时提示用户输入有效 int 会导致无限循环

标签 c scanf

int main(void) {
  int x;

  do {
    printf("Height: ");
  } while(!((scanf("%d", &x)) == 0) && !(x > 0 && x < 23));

}

我想简单地提示用户输入 0 到 23 之间的数字,如果输入无效(不是整数或超出范围),我想再次提示,直到他们做得正确为止。但是,第一次输入无效整数时,我会在无限循环中一遍又一遍地打印“高度”。我如何提示他们直到输入有效?

当我输入超出范围的数字时它起作用,但当我输入像“abc”这样的字符串时它不起作用

最佳答案

当且仅当用户输入了可以转换为 int 的内容时,

scanf 才会返回 1。

如果 scanf 不返回 1,那么您的工作就是清除流,以便可以读入另一个值。您可以使用惯用的方式来执行此操作

{
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
}

正是您没有做的第二件事似乎导致您的代码无休止地打印。

还有更简洁的方法,但这是一个起点:

int main(void) {
    int x;    
    do {            
        printf("Height: ");
        if (scanf("%d", &x) != 1){
            // invalid input, clear the stream and go round again.
            int c;
            while ((c = getchar()) != '\n' && c != EOF);
            continue;
        }
   } while (x < 0 || x > 23);
   return x;
}

(有些人不喜欢以我的方式编写的空 while 循环。如果不符合您的口味,请进行相应调整:有些公司禁止它。)

关于C - 当输入不是 int 时提示用户输入有效 int 会导致无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50850281/

相关文章:

c - 接收两个矩阵的元素后出现分割错误

c - 扫描数据多于预定义值的号码

c - Scanf输入及其他问题

c - scanf 测试在 C 函数内部失败

c - 在 union 内声明结构变量的目的

c - 如何摆脱 c 中的 "expression must be a modifiable lvalue"?

objective-c - 在 iOS 中计算非整数指数

c - eclipse C 编译器无法识别//行注释

将存储为字符的十六进制字符串转换为C中的十进制

c - 为什么 printf 在删除 & 时不显示字符串并且不显示 C 中的地址?