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));
我有一个程序,我希望输入整数介于 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));