2015-04-01 89 views
-1

當它達到這個if語句時,不管輸入了什麼'option',它總是將if(option ==「y」||「Y」)條件設置爲true?即使條件爲假,語句也總是執行?

bool UserInterface::readInConfimDeletion() const 
{ 
    string option = ""; 
    cout << "Are you sure you want to delete these transactions? Y/N "; 
    cin >> option; 

    if (option == "y" || "Y") 
    { 
     return true; 
    } 
    else if (option == "n" || "N") 
    { 
     return false; 
    } 
    else{ 
     readInConfimDeletion(); 
     } 

} 
+0

可能的重複[如何比較Java中的字符串?](http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java) – EJP 2015-04-01 10:49:58

+2

@EJP這是C++不是java – EdChum 2015-04-01 10:50:47

+0

底線是不要把C++'if'條件當成你說英語。 *如果選項等於'Y'或'y'*在講話時可以理解,但C++不以這種方式工作。 – PaulMcKenzie 2015-04-01 10:52:35

回答

4

你不能比較多的條件是這樣的:如果評估

if (option == "y" || "Y") 

的 「Y」 條件將評估爲true始終。

你需要這樣做:

if (option == "y" || option== "Y") 

它會更簡單IMO爲大寫的字符串,執行單對比,有一些選項來做到這一點:Convert a String In C++ To Upper Case

所以可能解決辦法是:

#include <boost/algorithm/string.hpp> 
string upperStr = boost::to_upper_copy(option); 

那麼你可以做:

if (upperStr == "Y") 
+1

不幸的是,'std :: toupper'只能用於'char',而option是一個'std :: string'。仍然是最好的事情,但[與圖書館或簡單的支持功能](http://stackoverflow.com/questions/735204/convert-a-string-in-c-to-upper-case),或操作'option [0]',或將'option'改爲'char'(所有略有不同的含義/妥協)。 – 2015-04-01 11:05:56

+0

感謝您指出,出於某種原因,我認爲這將工作,不應'std :: toupper(option.c_str())'工作嗎? – EdChum 2015-04-01 11:13:11

+1

不... ...'std :: toupper'不會接受'const char *''.c_str()'返回...我希望這很容易!無論如何,你可以使用'std :: toupper(* option.c_str())',但這相當於'std :: toupper(選項[0])。上面我的評論中的鏈接列出了處理完整字符串的一些選項.... – 2015-04-01 11:20:25

2

改變這樣的:

if (option == "y" || option == "Y") 

,同樣

else if (option == "n" || option == "N") 

你不能比較多串喜歡自己正在做的方式。

2

你需要說option == "y" || option == "Y"等。

FYI/if (option == "y" || "Y")實際上,如果本身是true"Y"是一個字符串字面經歷一個標準轉換到const char*然後option == "y"或... "Y"問 - 被使用在if內經歷了進一步轉換爲booltrue(因爲指針不是nullptr,它被認爲是true)。

相關問題