2016-03-10 116 views
1

我需要找到一個由用戶以有效方式在1到1000之間確定的數字。它看起來像在工作,但我有一個問題。每當while循環迭代時,它會自我迭代兩次,我無法逃避這種情況。所以我不能稱之爲「完全」工作。我的代碼是:while循環在每次迭代中工作兩次

#include <stdio.h> 

int main() 
{ 
    int num = 500, div = 250; 
    char user; 

    printf("Please determine a number between 1 and 1000 and then press enter. \n"); 

    scanf("%c", &user); 

    while ((user != 'Y') && (user != 'y')) 
    { 
     printf("Is your number %d? Please enter 'Y' if it is, 'S' if it is smaller and 'L' if it is larger. \n", num); 

     scanf("%c", &user); 

     if ((user == 'S') || (user == 's')) { 
      num -= div; 
      if (div != 1) 
       div /= 2; 
     } 

     if ((user == 'L') || (user == 'l')) { 
      num += div; 
      if (div != 1) 
       div /= 2; 
     } 
    } 

    printf("The number you determined is %d!", num); 

    return 0; 
} 

我該如何解決這個問題?

編輯:我無法將CodeBlocks的輸出示例添加到Ubuntu中。輸出如下:

請確定一個數字,然後按回車。

你的號碼是500嗎?如果是,請輸入「Y」;如果它較小,請輸入「S」 ;如果較大,請輸入「L」。 s

你的號碼是250嗎?如果是,請輸入「Y」;如果它較小,請輸入「S」 ;如果較大,請輸入「L」。

你的號碼是250嗎?如果是,請輸入「Y」;如果它較小,請輸入「S」 ;如果較大,請輸入「L」。 s

你的號碼是125嗎?如果是,請輸入「Y」;如果它較小,請輸入「S」 ;如果較大,請輸入「L」。

你的號碼是125嗎?如果是,請輸入「Y」;如果它較小,請輸入「S」 ;如果較大,請輸入「L」。 l

你的號碼是187嗎?如果是,請輸入「Y」;如果它較小,請輸入「S」 ;如果較大,請輸入「L」。

你的號碼是187嗎?如果是,請輸入「Y」;如果它較小,請輸入「S」 ;如果較大,請輸入「L」。 y

您確定的數字是187!

user3121023已經解決了這個問題。我認爲既然這是一個評論,我不能解決這個問題。

+0

感謝您的回覆,我實際上讀到enter也被接受爲char,並且因爲它不是「y」,它會在while循環中獲取正確的值,以便程序正常工作。我添加了來自gedit的輸出,那還有什麼呢? – morpheus

+0

當我使用它時,它只是重複scanf,直到我輸入一個字符而不是輸入,並且當我輸入一個字符並輸入時,它仍然會工作兩次。它看起來更像是while循環有問題,因爲首先printf和scanf工作正確。 – morpheus

+0

哦,我的壞...抱歉,我的腦袋因爲有點模糊。它現在可以正常工作。謝謝你的幫助! – morpheus

回答

3

%c格式說明符爲scanf將讀取任意字符,包括空格。所以下一次循環時,它會讀取換行符並繼續前進。

您需要在格式說明符中放置前導空格以吸收輸入緩衝區中的換行符。

scanf(" %c", &user); 
+1

不錯的一個!我沒有想到... –