C ++查找方法不起作用

时间:2014-07-31 16:48:04

标签: c++ string methods find

我对c ++很陌生,所以我对缺乏知识感到抱歉,但是出于某种原因,我的find方法无效。任何帮助都会很棒,这是我正在使用的代码。

www.pastie.org/9434690

//String s21 
string s21 ="| o |";  

if(s21.find("1")){
    cout << "IT WORKS OMG " << s21 << endl;
}
else if(!s21.find("1")){
    cout << "HASOSDKHFSIF" << endl;
}

由于

忘记提及,代码总是打印“IT WORKS”,即使字符串中没有“o”。

3 个答案:

答案 0 :(得分:6)

这里的问题是你的if语句。 s21.find("1")将返回要匹配的字符串的字符串中第一个匹配项的索引。如果找不到匹配项,则返回string::npos,这是值-1的枚举。如果语句将在所有不等于零的数字上返回true。所以你需要像string::npos这样对它进行测试:

if(s21.find("1") != std::string::npos)
{
    cout << "IT WORKS OMG " << s21 << endl;
}
else
{
    cout << "HASOSDKHFSIF" << endl;
}

答案 1 :(得分:4)

std::string::find的返回值是找到的子字符串的第一个字符的位置,如果找不到这样的子字符串,则为std::string::npos

您应该使用 std::string::npos 进行字符串匹配

if(s21.find("1") != std::string::npos )
{
    cout << "IT WORKS OMG " << s21 << endl;
}
else 
{
    cout << "HASOSDKHFSIF" << endl;
}

答案 2 :(得分:0)

如果你想要聪明一点,std::string::npos是二进制文件中最大的unsigned int1111 1111 1111 1111(人们有时会将str.find()与int -1进行比较,尽管不推荐)。您可以通过一点bitwise manipulation来利用此位模式。

翻转所有位将为每个位模式提供非零值,除了std::string::npos,并且由于C ++将所有非零值视为true,您的if实际上可能是:

if(~s21.find("1"))
{
    cout << "IT WORKS OMG " << s21 << endl;
}
else if(!~s21.find("1"))
{
    cout << "HASOSDKHFSIF" << endl;
}