2013-05-15 68 views
0

我要求用戶輸入,但我想問題留在屏幕上,直到輸入滿足允許的輸入之一。這是我的代碼C++做 - 雖然循環,直到一個字符串符合某些標準

string input = ""; 
string departure = ""; 

cout << "Please enter an airport code: "; 

do 
{ 
    getline(cin,input); 
    stringstream(input) >> departure; 

} while(departure.compare("MAN") != 0 || departure.compare("EMA") != 0 || departure.compare("LHR") != 0); 
} 

我希望它循環直到用戶進入MAN或EMA或LHR;如果它們是小寫字母,我也希望它被接受。

每次我運行這個程序時,即使我輸入了正確的輸入,它也只是不停地輸入內容,並且什麼都不做。

回答

2

條件

departure.compare("MAN") != 0 || departure.compare("EMA") != 0 || departure.compare("LHR") != 0 

總是真實的,不管是什麼departure是。

compare返回0關於平等。那麼你基本上告訴編譯器是

運行循環,而departure比「MAN」 OR不同於「EMA」 OR不同於「LHR」不同。

+0

是否有任何其他的方式來比較出發,以一個那些字符串? – Khalid

+0

@MHHeisenberg'比較'是正確的,你只需要重新思考邏輯。不要只是把'&&'放在那裏,但真的試着去理解。 –

+0

@Dukeling true,thx。 –

0

你需要& &,而不是||在你的情況下。

該條件總是返回true,因爲它不能一次全部爲3。

& &只要輸入是接受的3個之一就會返回false。

1

考慮使用boost :: to_upper將輸入轉換爲大寫,然後再在while(...)語句中執行比較。這將解決小寫/大寫問題。

http://www.boost.org/doc/libs/1_41_0/doc/html/boost/algorithm/to_upper.html

此外,與C++字符串處理的時候,我建議你根本

出發== 「MAN」 ||離開==「EMA」||離開==「LHR」

與其他語言(例如Java)不同,您不需要在C++中執行string.compare,因爲==運算符被重載以比較字符串的/ content /而不是字符串對象本身。

還有人打我,比較方法返回0時相等。

+0

哦,謝謝,它現在按預期工作。 – Khalid

0

首先您對while循環的條件不正確。現在它讀取,雖然離開不是'人'或不是'EMA'或不是'LHR',繼續循環。因爲離開不能同時完成,所以循環不會結束。我會建議更換您的OR的(||)與和的(& &)

同時,你需要明確在出發的價值循環的每次執行,否則以前輸入線仍然存在,您的比較將即使失敗輸入正確的機場代碼。

+0

謝謝,我現在看到爲什麼&&是正確的,而不是||。 – Khalid

0

我們的主要問題是字符串被錯誤地比較。假設我們輸入「MAN」。

如果字符串不是「MAN」,則departure.comare("MAN") != 0將爲真。好的,我們輸入「MAN」,所以它是錯誤的。現在我們或者departure.compare("EMA") != 0 - 這是事實,因爲「MAN」不等於「EMA」。所以你需要用&&而不是||來梳理你的病情。

要修復「owercase」,有兩種選擇。可以將輸入字符串轉換爲大寫,也可以與小寫和大寫(Man,MaN,mAn等)的所有不同組合進行比較 - 後者非常快速地非常繁瑣。

看一看這一個在不區分大小寫的方式比較字符串的一些選項: Case insensitive string comparison C++

+0

謝謝,但是當我輸入不正確的輸入時,它會進入下一行,有沒有將它保留在問題旁邊? – Khalid