2010-07-14 33 views
2

我有以下if語句,其中兩個似乎不工作。當我嘗試將它與單個字符「y」或「n」進行比較時,我不明白它爲什麼會起作用,但當我試圖將其與另一個語句中的兩個字符進行比較時,我不明白它爲什麼起作用。其他如果字符串比較問題

我最後的問題是,如果有更好的更清潔的方式來寫這個或如果這可以接受一個簡單的提示檢查?

getline(cin,somestr); 

if(somestr.empty()){ 
//do this 
} 
else if (somestr == "y" || "Y"){ 
//do something else 
} 
else if (somestr == "n" || "N"){ 
//do something else 
} 
else{} 
+0

有趣的是,當我在童年時使用BASIC時,我認爲「或」就像那樣工作。花了我多年的時間和互聯網瞭解我的錯誤... – Klaim 2010-07-14 20:42:18

回答

6

不幸的是,語言不給你一個簡單的方法來檢查變量對可能性的集合。您必須單獨進行每項測試或使用switch語句。所以,無論是下面的代碼示例的將是你的問題的一個有效的解決方案:

else if (somestr == 'y' || somestr == 'Y'){ 
//do something else 
} 
else if (somestr == 'n' || somestr == 'N'){ 
//do something else 
} 


switch (somestr) { 
    case 'y': 
    case 'Y': 
     // do something 
     break; 

    case 'n': 
    case 'N': 
     // do something 
     break; 

    default: 
     break; 
} 

或者,您也可以通過減少一些你的邏輯,清理你的代碼位(假設somestrchar):

// Convert to uppercase first and only one comparison is needed 
else if (toupper(somestr) == 'Y'){ 
//do something else 
} 
else if (toupper(somestr) == 'N'){ 
//do something else 
} 
+0

非常感謝這個,真的很有幫助! – Tek 2010-07-14 21:02:27

+1

我們通常希望避免在交換機中出現故障情況,特別是如果我們不知道如何正確使用它們,因爲它們是一些非常模糊的錯誤的來源。在每種情況下,通常都會使用「break」,如果沒有習慣性的「/ * FALLTHROUGH * /」明確地讓任何其他讀者知道該行爲是有意的,則通常不清楚這是否是有意的。 – 2010-07-14 21:15:17

+0

選擇此作爲努力的答案,併成爲最有幫助的答案:) – Tek 2010-07-14 21:18:53

9

你會做這樣的:

else if(somestr == "y" || somestr == "Y") 
+0

詳細闡述:'||'運算符在每一邊都有一個表達式。在布爾上下文中單獨表達「N」等價於「N」!= 0。所以原始代碼等同於'if(somestr ==「n」||「N」!= 0)'。 – Chuck 2010-07-14 20:31:26

+0

什麼樣的方式讓自己在世界前感到啞巴!當然是這樣!我不敢相信我犯了這樣一個愚蠢的錯誤。我可能是C++的新手,但沒有那麼多!:P – Tek 2010-07-14 20:31:35

+0

好吧,這不是那麼愚蠢,我看到許多初學者在很多語言中犯這個錯誤。因爲當你說話的時候,你傾向於把它說成「如果x等於1或2」,但很少聽到有人說「如果x等於1或等於2」,所以人們試圖按照他們聽到的方式編寫代碼。 – FrustratedWithFormsDesigner 2010-07-14 20:33:02

0

你應該寫兩個比較

somestr == "n" || somestr=="N" 
0

首先,你需要解決這個問題:

(somestr == "y" || "Y") to (somestr == "y" || somestr == "Y") 

(somestr == "n" || "N") to (somestr == "n" || somestr == "N") 

否則,這些表達式始終爲true,因爲任何字符串本身的,如「Y」爲真比0

其次別的其他一起,你可以,如果它想再次要求輸入不是「y」,「Y」,「n」或「N」。您可以使用do-while循環來完成此操作。

7
if (somestr == "y" || "Y"){ 

請記住,在C++ 0是錯誤的,其他一切都是真實的。由於"Y"不是零,所以是真的。所以你寫的是:if (something || true)。這總是如此。

1

我會做類似

else if(someFunctionThatConvertsToUpper(somestr) == "Y") 
+0

我也是,但我會降低而不是上限。個人喜好。 :) – 2010-07-14 22:10:47

1

花葯選擇,特別是如果你只需要字符 - 它看起來像Y或N(是)或不 - 是讀取char而不是字符串,並使用switch語句。

char somechar; 
cin.get(somechar); 

switch(somechar){ 
    case 'y' : case 'Y': 
    //do something 
    break; 
    case 'n' : case 'N': 
    // do something else 
    // break; 
    default: 
    // do something else 
} 
+0

@bta鍵入一個比我快的速度。 – xdumaine 2010-07-14 20:40:39