2013-01-19 49 views
2

,所以我有這樣的代碼:小C++的幫助,請(重複輸出)

#include <iostream> 
#include <cstdlib> 
using namespace std; 

int main() 
{ 

    int x; 
    x=rand(); 
    int guess; 
    do{ 
     cout<<"Enter your guess:"; 
     cin>>guess; 
     if(guess==x)cout<<"You got it ! ;)\n"; 
     else { 
      cout<<"Wrong("; 
      if (guess<x) cout<<"too small)\n"; 
      else cout<<"too big)\n"; 
     } 

    } while (guess != x); 

    return 0; 
} 

問題:編譯和運行這個程序後,我輸入「999999999999」,它不斷重複的「太大」。爲什麼這樣呢?

附加信息:當我將x的值設置爲常量10時,我輸入了11,我注意到它只重複了一次「太大」。有什麼我不知道的?或者是代碼有缺陷?

非常感謝:)

+0

整數溢出是我的猜測... – Floris

+2

調試算法的提示,而不是使用隨機數使用特定的數字。然後你知道答案是什麼,並且可以正確測試。 –

回答

7

如果你看一下data types,你會看到一個int只能保留最多爲2,147,483,647 。當你嘗試輸入一個比你的數據類型能容納的更大的數字比std::cout失敗的數字更大時,它會在下一個循環中再次嘗試並處理它,這也會失敗,並且會以無限循環發送給你。

您可以通過使用更大的數據類型來解決您的問題。


- INT的大小取決於你的機器上,請http://en.cppreference.com/w/cpp/language/types爲範圍的列表int可以支持

+0

我通過改變'int guess'來修復它。以'長整猜'。謝謝你的時間!非常感激! – kuan

+2

'int'不一定是32位。它可能是16歲以上。 – chris

+0

@chris確實如此,但是在今天的大多數機器上,它都是32位以上的。 (寫下來會導致更多的混淆OP和脫離問題) – Caesar

1

你期望這個代碼永遠是成功的:

cin>>guess; 

std::ios_base派生的類型,如std::cin可能會進入錯誤狀態。

您可以通過在bool上下文中使用流來完全處理此問題。

}while (cin && guess != x); 
+0

哦,我明白了!非常感謝提示,請牢記它! – kuan

+0

在您拉取數據之前或之後放入一個'if(cin)'在這種情況下將無濟於事,因爲它不會將其發送到錯誤狀態。你可以爲你自己嘗試。 – Caesar

1

如果你到底發生了什麼的很好奇,看看this cplusplus.com thread,其中有人在具有std::cin閱讀過大的數字非常類似的問題。第二海報,「INT主」概括起來非常漂亮(重新格式化位爲SO):

cin.fail()檢測值是否進入裝配在變量定義 的值。但是,如果cin.fail()是真實的,這意味着:

  • 輸入的值不適合變量
  • 變量將不會受到影響
  • 的河道內仍然是斷開的
  • 輸入電壓值仍然在該緩衝區將用於下一個cin >> variable聲明。

因此,你必須做到以下幾點:

  • 修復通過cin.clear()
  • 的河道內明確與cin.ignore(std::numeric_limits<int>::max(), '\n')

緩衝區我仍然覺得這種行爲怪異和違反直覺的,但至少我們知道現在發生了什麼。

注意:聲明「該變量不會受到影響」是不真實的,至少對於我的系統(g ++ 4.6)來說。該變量實際上被設置爲最大可能值。這使得輸入值在流上更加難以解釋...