首页 > 解决方案 > C - 当输入不是 int 时,提示用户输入有效的 int 会导致无限循环

问题描述

int main(void) {
  int x;

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

}

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

当我输入一个超出范围的数字时它可以工作,但当我输入一个像“abc”这样的字符串时它就不行了

标签: cscanf

解决方案


scanf当且仅当用户输入了可以转换为int.

如果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我这样写的空循环。如果不符合您的口味,请进行相应调整:有些公司会禁止它。)


推荐阅读