2013-02-18 218 views
0

我不明白爲什麼這個while循環不停止,一旦結束條件匹配?爲什麼這個while循環停止?

這個想法是用戶輸入一個5位數的整數,並可以鍵入其他任何東西來終止輸入過程。但

bool noerror(true); 
int n(0),part2temp; 
vector<int> part2; 

while(noerror){ 
    cout << "Please enter the 5 integer (x to stop)" << endl; 
    cin >> part2temp; 
    part2.push_back(part2temp); 
    n++; 

    if (cin.fail()||part2temp>99999||part2temp<10000){ 
     cout << "End condition matched" << endl; 
     cin.clear(); 
     cin.ignore(10); 
     noerror=(false); 
    } 
} 
cout << "escaped loop" << part2[n] << endl; 

我得到的輸出從循環的中頻部分的畫面時,我在X的例子,但由於某些原因改變布爾值不會終止循環和文本輸入「逃脫環」從未在屏幕上顯示。

誰能告訴我我做錯了什麼?

+0

有幾件事:首先,矢量中的索引從[0 ... n]開始,所以'part2 [n]'索引一個超過結尾。第二,你不需要跟蹤矢量中元素的數量,「std :: vector」爲你做這件事;使用'part2.size()'來獲取值。第三,假設vector非空,'part2.back()'是訪問最後一個元素的最簡單方法。 – 2013-02-18 09:26:56

+0

什麼樣的最終條件(你有三個)不符合你的期望?他們全部?? – WhozCraig 2013-02-18 09:27:00

+0

另外,您應該檢查是否在訪問'part2temp'(即'push_back'之前)之前_before_失敗。 (你應該在循環中定義'part2tmp',而不是在其外面。) – 2013-02-18 09:28:35

回答

3

有不確定的行爲作爲part2[n]會一舉超越vector的界限,可能是下面的代碼行的輸出永遠不會出現的原因:

cout << "escaped loop" << part2[n] << endl; 

給人的印象,循環就不退出。如果循環只執行一次,然後n == 1並且將只有一個元素vector名爲part2,這意味着只有part2[0]是有效的。爲了證實這一點使用vector::at()並在try{}catch(std::out_of_range&)塊包裝它:

try 
{ 
    cout << "escaped loop" << part2.at(n) << endl; 
} 
catch (std::out_of_range const&) 
{ 
    std::cerr << "Access out of range\n"; 
} 

要糾正,確認vectorempty(),並請使用[n - 1]vector.back()

+0

我從代碼中刪除了該部分,因爲它不是必需的,謝謝指出它,即時通訊與編程語言混合在一起.. – user2054823 2013-02-18 09:31:01

+0

@ user2054823,我不清楚問題現在是否已解決?順便說一句,除非在其他地方需要'noerror',否則你可以在'if'和'noerror'變量中''while''中斷''而不再需要。 – hmjd 2013-02-18 09:34:26

+0

@hmjd不建議對沒有經驗的程序員使用'break'。從全球來看,這幾乎不是一個好主意。一個更好的解決方案是創建一個用提示讀取的函數,然後循環:像'while(getlineWithPrompt(prompt,line))'(其中'getlineWithPrompt'返回'std :: cin')。 – 2013-02-18 09:56:30

2

你爲什麼用cin.ignore()?正如所寫,cin.ignore()只會在讀取10個字符後纔會返回。你真的希望用戶在輸入之後必須輸入10個字符(在他輸入新行之前)?如果輸入是面向行的,則通常的步驟是使用std::getline來讀取整行,然後使用std::istringstream解析它;或者,您可以使用類似std::cin.ignore(MAX_INT, '\n');的內容,這會忽略到下一個新行。

+0

我已經修復了這個問題,結果表明它不喜歡: cin.ignore(10); 並且從來沒有真正到過布爾設置爲false的行。我不知道爲什麼這是一個問題,但通過將其更改爲: cin.ignore(10,'\ n'); 如果任何人都可以向我解釋,我將不勝感激,感謝迄今爲止所有的幫助! – user2054823 2013-02-18 09:38:03

+0

+1爲實際原因。 – hmjd 2013-02-18 09:45:46

+0

@ user2054823正如我在我的回答中所說的,'cin.ignore(10)'只有在能夠讀取10個字符(或遇到文件結尾)時纔會返回。 'cin.ignore(10,'\ n');'最多可以忽略10個字符;如果用戶在號碼後輸入20個空格,則可能無法獲得理想的效果。 – 2013-02-18 09:53:54

0

變化

cin.ignore(10);

cin.ignore(10, '\ n');

然後循環退出,試試吧!

+0

哎呀!我遲到了!你已經解決了你的問題! – 2013-02-18 09:40:43