C程序在scanf获得意外数据后无限循环
我有一个程序,我希望输入的整数在2到64之间,所以我把C程序在scanf获得意外数据后无限循环,c,scanf,C,Scanf,我有一个程序,我希望输入的整数在2到64之间,所以我把scanf放在do{…}循环中。以下是我最初测试的代码: int initialBase; do { printf("Initial base: "); scanf("%i", &initialBase); } while (initialBase < 2 || initialBase > 64); int initialBase; 做{ printf(“初始基数:”); scanf(“%i”和initialB
scanf
放在do{…}循环中。以下是我最初测试的代码:
int initialBase;
do {
printf("Initial base: ");
scanf("%i", &initialBase);
} while (initialBase < 2 || initialBase > 64);
int initialBase;
做{
printf(“初始基数:”);
scanf(“%i”和initialBase);
}而(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));
有人愿意评论我为什么被否决吗?这并不奇怪,scanf()就是这样工作的。那么,为什么它会停止提示呢?因为已经有缓冲数据了。scanf不会因为无法解析而放弃它。我不是被否决的选民之一,但我怀疑你被否决了,因为stackoverflow.com上有太多的帖子描述了使用scanf
进行用户输入的问题。一个常见的建议是不要使用scanf
,而是使用getline
或类似的东西,然后对字符串进行后期解析。因此,基本上你是说,如果用户输入类似“A”的内容,我无法继续提示有效的输入?@PatrickRoberts你可以,但你必须从输入流中清除未读字符,而fflush()
不是解决方案。检查我新发布的代码。对于fgetc
,除了
之外,我还必须为fgetc
添加吗?不,只需为这两者添加
,fgetc()
和scanf()
。使用编译器警告,这将节省您很多时间,例如,当您忘记#include
时,可能会发生一些错误,如果您让编译器抱怨所有问题,则可以避免这些错误。@PatrickRoberts当您在堆栈溢出上发布代码时,不应忽略初始化之类的内容,在您发布的代码中,initialBase
没有初始化,这就是我指出这一点的原因。这只是对你将来的帖子的建议。一个建议,发布一个新问题和新问题,并试图找到尽可能小的程序来重现这个问题。它将帮助您提高调试技能,并且更容易回答。
int initialBase;
initialBase = 0;
do {
printf("Initial base: ");
if (scanf("%i", &initialBase) != 1)
{
while (fgetc(stdin) != '\n');
continue;
}
} while ((initialBase < 2) || (initialBase > 64));