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

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

 int initialBase; do { printf("Initial base: "); scanf("%i", &initialBase); } while (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)); 

如果你输入一些不是数字的东西,那么检查会突破循环,初始化初始化只是一个好习惯,在你的情况下可能会阻止你描述的行为,但在这种情况下,它会阻止访问未初始化的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));