簡體   English   中英

c中猜測數字程序中的無限循環

[英]infinite loop in the guessing number program in c

對於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;
}

如果scanf無法按照指定的格式解析其輸入,則該輸入將保留在輸入緩沖區中,以供下一次對scanf調用使用,它將讀取完全相同的輸入,並再次失敗。 等等等等……

簡單的解決方案是首先使用fgets 讀取整個輸入 然后,您可以在該輸入(現在已提取)中使用sscanf嘗試對其進行解析。


當前的代碼進一步復雜化的事實是,如果scanf以其他某種方式失敗,它將返回EOF ,它是整數-1 ,即“ true”。 當然,這也會導致邏輯和循環問題。

我在另一篇文章中看到此回復: 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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM