2013-02-26 63 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

相关问题