我对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”。
答案 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 int
或1111 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;
}