C程序在scanf得到意外数据后无限循环

C program loops infinitely after scanf gets unexpected data

我有一个程序,我希望输入整数介于 2 和 64 之间(含 2 和 64),所以我将 scanf 放在 do { ... } while 循环中。这是我最初测试的代码:

int initialBase;

do {
  printf("Initial base: ");
  scanf("%i", &initialBase);
} while (initialBase < 2 || initialBase > 64);

问题是每当输入不是有效整数时,它只会无限期地输出 printf 语句,不再提示用户输入,立即淹没控制台。为什么会发生这种情况,什么是读取满足我想要的条件的输入的更好方法?

scanf()失败时,参数不会自动初始化,未初始化的值可以是任何值,所以可能小于2或大于64没人知道.

试试这个

int initialBase;

/* some default value would be good. */
initialBase = 2;
do {
  printf("Initial base: ");
  if (scanf("%i", &initialBase) != 1)
      break;
} while ((initialBase < 2) || (initialBase > 64));

如果您输入的不是数字,检查将跳出循环,initialBase 的初始化只是一个好习惯,在您的情况下本可以阻止您描述的行为,但在在这种情况下,它是为了防止在 while 循环之后访问未初始化的值。

循环没有停止的原因是 scanf() 在不匹配时在输入流中留下了一些字符,当这些字符仍然存在时再次调用 scanf() 将使scanf() 继续等待有效输入,但立即返回流中当前无效的输入,如果要继续阅读,请尝试从流中读取字符,直到找到 '\n',这样

int initialBase;

initialBase = 0;
do {
    printf("Initial base: ");
    if (scanf("%i", &initialBase) != 1)
    {
        while (fgetc(stdin) != '\n');
        continue;
    }
} while ((initialBase < 2) || (initialBase > 64));