2013-02-26 74 views
0

我對C++相當陌生,所以原諒我,如果這是一個愚蠢的問題,但我已經搜索,我只發現了一些關於std::find這似乎並沒有做我想做的事(也許我沒有正確使用它)。如果字符串在數組中,請執行此操作?

作爲一個例子,說我有一個基本的程序,可以存儲您的性別。我有一個if語句,如果用戶輸入「男性」或「男性」,它只是檢查,然後做任何我想要它做的像這樣:

if(gender == "male" || gender == "Male"){ 
    // Do stuff 
} 

我想將其展開,以便用戶可以輸入「m」或「M」,它會被檢測爲男性。不過,我覺得如果是這樣,我想堅持選項加入到一個簡單的數組和做聲明將是一個有點亂:

if(gender is in maleArray){ 
    // Do stuff 
} 

這可能嗎?我並不太在意所涉及的任何不良做法,因爲這是一個學習場景,儘管任何(有用的)批評或替代方案都受到讚賞,就像示例一樣!

在此先感謝,希望我已經說清楚了。

+4

'std :: find'會做你想做的事。 – 2013-02-26 16:47:47

+0

你能舉一個例子作爲答案嗎?我似乎無法把握它作爲一種條件。 – whitfin 2013-02-26 16:49:15

+0

所以'std :: string :: find'。 – 2013-02-26 16:49:26

回答

4

你要求的解決方案是:

std::array<std::string, 4> male_synonyms = {"Male", "male", "M", "m"}; 
auto it = std::find(male_synonyms.begin(), male_synonyms.end(), gender); 
if (it != male_synonyms.end()) { 
    // ... 
} 

它使用std::find,看看如果用戶輸入gender是一個字符串male_synonyms的序列中。 std::find如果沒有找到它,則返回最後一個迭代器,所以這就是我們檢查的內容。

不過,我更喜歡這樣的:

std::transform(gender.begin(), gender.end(), gender.begin(), std::tolower); 
if (gender == "m" || gender == "male") { 
    // ... 
} 

這將接受不區分大小寫mmale。所以MalE,M,mALE等也是正確的。

+1

矢量是很好的,因爲它們動態擴展/收縮。你必須小心,因爲根據我的理解,他們可以做很多重新分配的內存。 – crush 2013-02-26 16:59:59

+0

您可能需要'static_cast (std :: lower)'來編譯第二個代碼片段(如果* *的tolower過載也是可見的) – Praetorian 2013-02-26 17:00:49

2

如果你關心的是if語句的混亂,你可以有一個方法isMale(),它返回一個布爾值。然後你可以像使用(isMale(gender))一樣使用它。

bool isMale(std::string gender) 
{ 
    if(gender == "male" || 
     gender == "Male" || 
     gender == "M" || 
     gender == "m"  ) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

如果你不關心的話,你可以性別字符串轉換爲所有小的情況下,並且然後與「男性」和「m」。

+0

如何強制它小寫? – whitfin 2013-02-26 16:58:00

+1

有多種方法強制小寫,但這也許是最好的:http://stackoverflow.com/questions/313970/stl-string-to-lower-case – crush 2013-02-26 17:00:19

相關問題