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

时间:2018-09-12 07:00:05

标签: c scanf infinite-loop

当涉及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;
}

2 个答案:

答案 0 :(得分:2)

如果scanf无法按照指定的格式解析其输入,则该输入将保留在输入缓冲区中,以供下次调用scanf时使用,该读取将读取相同的输入,并再次失败。等等等等……

简单的解决方案是首先例如使用读取整行输入fgets。然后,您可以在该输入(现已提取)中使用sscanf来尝试对其进行解析。


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

答案 1 :(得分: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
}