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

时间:2015-01-27 17:56:51

标签: c scanf

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

int initialBase;

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

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

1 个答案:

答案 0 :(得分:3)

scanf()失败时,参数不会自动初始化,未初始化的值可以是任何值,因此它可能小于2或大于64没有人知道。< / p>

试试这个

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() 1}}继续等待有效输入,但立即返回流中当前无效的输入,如果你想继续阅读,尝试从流中读取字符,直到找到'\n',这样

int initialBase;

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