Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序在scanf获得意外数据后无限循环_C_Scanf - Fatal编程技术网

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

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

我有一个程序,我希望输入的整数在2到64之间,所以我把
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));