c中猜测数字程序中的无限循环

问题描述 投票:-1回答:2

归结为C编程时,我还是比较新的。这就是为什么我通过做一些简单的练习来努力工作。我正在进行的练习是“猜数字”游戏,用户必须猜测两个数字(上限和下限)之间的数字。该程序正在做它必须做的事情,但有一个例外:当用户输入一个字符而不是整数时,程序会陷入无限循环。打破这个循环的唯一方法是使用break语句并重新启动程序。我想要的是,再次输入用户输入的程序请求,直到输入一个整数。

有人能告诉我为什么程序卡在这个无限循环中以及为什么它不像第一次迭代那样通过scnanf再次请求输入?你的帮助将不胜感激。谢谢。

//globals
int secret_nr;
int guess;
int upper_bound = 100;
int lower_bound = 1;
int total_guesses = 1;


void check_input(void) {
    if (guess < lower_bound || guess > upper_bound) {
        printf("Invalid input! Your guess must be between %d and %d\n", lower_bound, upper_bound);
    }
    else if (guess < secret_nr) {
        printf("Higher\n");
        total_guesses++;
    }
    else if (guess > secret_nr) {
        printf("Lower\n");
        total_guesses++;
    }
    else if (guess == secret_nr) {
        printf("correct! You guessed the number after guessing %d times!\n", total_guesses);
    }
}


int main(int argc, char* argv[]) {
    srand(time(NULL));
    secret_nr = (rand() % upper_bound) + 1;

    printf("Guess the number between %d and %d:\n", lower_bound, upper_bound);
    do {
        if (scanf("%d", &guess)) {
            check_input();
        }
        else {
            printf("Invalid input! Only integer values are allowed!\n");
            //break;
        }
    } while (guess != secret_nr);

    return 0;
}
c scanf infinite-loop
2个回答
2
投票

如果scanf无法根据指定的格式解析其输入,则输入将保留在输入缓冲区中,以便下次调用scanf,它将读取相同的输入并再次失败。等等......等等......

简单的解决方案是首先使用例如读取整行输入。 fgets。然后你可以在那个(现在提取的)输入中使用sscanf来尝试解析它。


使当前代码更加复杂的是,如果scanf以其他方式失败,它将返回EOF,这是整数-1,这是“true”。这当然会导致您的逻辑和循环问题。


1
投票

我在另一篇文章中看到了这个回复:https://stackoverflow.com/a/1716066/5687321

scanf仅使用与格式字符串匹配的输入,返回消耗的字符数。任何与格式字符串不匹配的字符都会导致它停止扫描并使无效字符仍在缓冲区中。正如其他人所说,在继续之前,仍然需要从缓冲区中清除无效字符。这是一个非常脏的修复,但它将从输出中删除有问题的字符。

char c = '0';
if (scanf("%d", &number) == 0) {
  printf("Err. . .\n");
  do {
    c = getchar();
  }
  while (!isdigit(c));
  ungetc(c, stdin);
  //consume non-numeric chars from buffer
}
© www.soinside.com 2019 - 2024. All rights reserved.