在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));