我有一个std::string类型的变量。我想检查它是否包含一个特定的std::字符串。我该怎么做呢?

是否有一个函数,如果找到字符串返回true,如果没有找到则返回false ?


当前回答

如果字符串的大小相对较大(数百字节或更多),并且c++17可用,您可能需要使用Boyer-Moore-Horspool搜索器(示例来自cppreference.com):

#include <iostream>
#include <string>
#include <algorithm>
#include <functional>

int main()
{
    std::string in = "Lorem ipsum dolor sit amet, consectetur adipiscing elit,"
                     " sed do eiusmod tempor incididunt ut labore et dolore magna aliqua";
    std::string needle = "pisci";
    auto it = std::search(in.begin(), in.end(),
                   std::boyer_moore_searcher(
                       needle.begin(), needle.end()));
    if(it != in.end())
        std::cout << "The string " << needle << " found at offset "
                  << it - in.begin() << '\n';
    else
        std::cout << "The string " << needle << " not found\n";
}

其他回答

这是一个简单的函数

bool find(string line, string sWord)
{
    bool flag = false;
    int index = 0, i, helper = 0;
    for (i = 0; i < line.size(); i++)
    {
        if (sWord.at(index) == line.at(i))
        {
            if (flag == false)
            {
                flag = true;
                helper = i;
            }
            index++;
        }
        else
        {
            flag = false;
            index = 0;
        }
        if (index == sWord.size())
        {
            break;
        }
    }
    if ((i+1-helper) == index)
    {
        return true;
    }
    return false;
}

使用std::string::find如下所示:

if (s1.find(s2) != std::string::npos) {
    std::cout << "found!" << '\n';
}

注意:如果s2是s1的子字符串,则打印"found!", s1和s2都是std::string类型。

你可以尝试使用find函数:

string str ("There are two needles in this haystack.");
string str2 ("needle");

if (str.find(str2) != string::npos) {
//.. found.
} 

如果字符串的大小相对较大(数百字节或更多),并且c++17可用,您可能需要使用Boyer-Moore-Horspool搜索器(示例来自cppreference.com):

#include <iostream>
#include <string>
#include <algorithm>
#include <functional>

int main()
{
    std::string in = "Lorem ipsum dolor sit amet, consectetur adipiscing elit,"
                     " sed do eiusmod tempor incididunt ut labore et dolore magna aliqua";
    std::string needle = "pisci";
    auto it = std::search(in.begin(), in.end(),
                   std::boyer_moore_searcher(
                       needle.begin(), needle.end()));
    if(it != in.end())
        std::cout << "The string " << needle << " found at offset "
                  << it - in.begin() << '\n';
    else
        std::cout << "The string " << needle << " not found\n";
}

实际上,你可以尝试使用boost库,我认为std::string没有提供足够的方法来做所有常见的字符串操作。在boost中,你可以只使用boost::algorithm::包含:

#include <string>
#include <boost/algorithm/string.hpp>

int main() {
    std::string s("gengjiawen");
    std::string t("geng");
    bool b = boost::algorithm::contains(s, t);
    std::cout << b << std::endl;
    return 0;
}