Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检查字符串是否包含C++;_C++_String_Substring - Fatal编程技术网

C++ 检查字符串是否包含C++;

C++ 检查字符串是否包含C++;,c++,string,substring,C++,String,Substring,我有一个类型为std::string的变量。我想检查它是否包含某个std::string。我该怎么做 是否有一个函数,如果找到字符串,则返回true;如果找不到字符串,则返回false?使用如下方法: if (s1.find(s2) != std::string::npos) { std::cout << "found!" << '\n'; } if(s1.find(s2)!=std::string::npos){ std::cout您可以尝试使用以下函数: s

我有一个类型为
std::string
的变量。我想检查它是否包含某个
std::string
。我该怎么做

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

使用如下方法:

if (s1.find(s2) != std::string::npos) {
    std::cout << "found!" << '\n';
}
if(s1.find(s2)!=std::string::npos){
std::cout您可以尝试使用以下函数:

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

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

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

#包括
#包括
int main(){
std::字符串s(“耿家文”);
std::字符串t(“geng”);
bool b=boost::algorithm::contains(s,t);
你可以试试这个

string s1 = "Hello";
string s2 = "el";
if(strstr(s1.c_str(),s2.c_str()))
{
   cout << " S1 Contains S2";
}
string s1=“你好”;
字符串s2=“el”;
if(strstrstr(s1.c_str(),s2.c_str())
{

cout如果您不想使用标准库函数,下面是一个解决方案

#include <iostream>
#include <string>

bool CheckSubstring(std::string firstString, std::string secondString){
    if(secondString.size() > firstString.size())
        return false;

    for (int i = 0; i < firstString.size(); i++){
        int j = 0;
        // If the first characters match
        if(firstString[i] == secondString[j]){
            int k = i;
            while (firstString[i] == secondString[j] && j < secondString.size()){
                j++;
                i++;
            }
            if (j == secondString.size())
                return true;
            else // Re-initialize i to its original value
                i = k;
        }
    }
    return false;
}

int main(){
    std::string firstString, secondString;

    std::cout << "Enter first string:";
    std::getline(std::cin, firstString);

    std::cout << "Enter second string:";
    std::getline(std::cin, secondString);

    if(CheckSubstring(firstString, secondString))
        std::cout << "Second string is a substring of the frist string.\n";
    else
        std::cout << "Second string is not a substring of the first string.\n";

    return 0;
}
#包括
#包括
bool CheckSubstring(std::string firstString,std::string secondString){
if(secondString.size()>firstString.size())
返回false;
对于(int i=0;i这是一个简单的函数

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;
}
bool-find(弦线、弦剑)
{
布尔标志=假;
int-index=0,i,helper=0;
对于(i=0;i
#包括//标准::搜索
#包括
使用std::search;使用std::count;使用std::string;
int main(){
string mystring=“大海捞针”;
string str=“针”;
string::const_迭代器it;
它=搜索(mystring.begin(),mystring.end(),
str.begin(),str.end())!=mystring.end();
//如果找到字符串…将迭代器返回到mystring中str的第一个元素
//如果找不到字符串…将迭代器返回给mystring.end()
if(it!=mystring.end())
//找到字符串
其他的
//找不到
返回0;
}

从这个网站上的众多答案中,我没有找到一个明确的答案,所以在5-10分钟内,我自己找到了答案。 但这可以在两种情况下实现:

  • 知道在字符串中搜索的子字符串的位置
  • 要么你不知道这个位置,一个字符一个字符地搜索它
  • >让我们假设在字符串“ABCDE”中搜索子字符串“CD”,我们使用C++中的最简单的子字符串内置函数 对于1:

    #include <iostream>
    #include <string>
    
        using namespace std;
    int i;
    
    int main()
    {
        string a = "abcde";
        string b = a.substr(2,2);    // 2 will be c. Why? because we start counting from 0 in a string, not from 1.
    
        cout << "substring of a is: " << b << endl;
        return 0;
    }
    
    #include <iostream>
    #include <string>
    
    using namespace std;
    int i;
    
    int main()
    {
        string a = "abcde";
    
        for (i=0;i<a.length(); i++)
        {
            if (a.substr(i,2) == "cd")
            {
            cout << "substring of a is: " << a.substr(i,2) << endl;    // i will iterate from 0 to 5 and will display the substring only when the condition is fullfilled 
            }
        }
        return 0;
    }
    
    #包括
    #包括
    使用名称空间std;
    int i;
    int main()
    {
    字符串a=“abcde”;
    字符串b=a.substr(2,2);//2将是c。为什么?因为我们从字符串中的0开始计数,而不是从1开始。
    
    cout您还可以使用系统名称空间。 然后可以使用contains方法

    #include <iostream>
    using namespace System;
    
    int main(){
        String ^ wholeString = "My name is Malindu";
    
        if(wholeString->ToLower()->Contains("malindu")){
            std::cout<<"Found";
        }
        else{
            std::cout<<"Not Found";
        }
    }
    
    #包括
    使用名称空间系统;
    int main(){
    String^whistring=“我的名字是Malindu”;
    如果(整体字符串->ToLower()->包含(“malindu”)){
    
    我们可以用这个方法代替。 只是我项目中的一个例子。 参考代码。 还包括一些额外费用

    注意if语句

    /*
    Every C++ program should have an entry point. Usually, this is the main function.
    Every C++ Statement ends with a ';' (semi-colon)
    But, pre-processor statements do not have ';'s at end.
    Also, every console program can be ended using "cin.get();" statement, so that the console won't exit instantly.
    */
    
    #include <string>
    #include <bits/stdc++.h> //Can Use instead of iostream. Also should be included to use the transform function.
    
    using namespace std;
    int main(){ //The main function. This runs first in every program.
    
        string input;
    
        while(input!="exit"){
            cin>>input;
            transform(input.begin(),input.end(),input.begin(),::tolower); //Converts to lowercase.
    
            if(input.find("name") != std::string::npos){ //Gets a boolean value regarding the availability of the said text.
                cout<<"My Name is AI \n";
            }
    
            if(input.find("age") != std::string::npos){
                cout<<"My Age is 2 minutes \n";
            }
        }
    
    }
    
    /*
    每一个C++程序都应该有一个入口点。通常,这是主要功能。
    每个C++语句以“;”(半冒号)结尾。
    但是,预处理器语句的末尾没有“;”。
    此外,每个控制台程序都可以使用“cin.get();”语句结束,这样控制台就不会立即退出。
    */
    #包括
    #include//可以代替iostream使用。还应包括以使用转换函数。
    使用名称空间std;
    int main(){//主函数。它在每个程序中首先运行。
    字符串输入;
    while(输入!=“退出”){
    cin>>输入;
    转换(input.begin(),input.end(),input.begin(),::tolower);//转换为小写。
    if(input.find(“name”)!=std::string::npos){//获取有关所述文本可用性的布尔值。
    
    cout如果功能对您的系统至关重要,那么使用旧的
    strstrstr
    方法实际上是有益的。
    algorithm
    中的
    std::search
    方法可能是最慢的。我想创建这些迭代器可能需要很多时间

    我用来给整件事计时的代码是

    #include <string>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <random>
    #include <chrono>
    
    std::string randomString( size_t len );
    
    int main(int argc, char* argv[])
    {
            using namespace std::chrono;
    
            const size_t haystacksCount = 200000;
            std::string haystacks[haystacksCount];
            std::string needle = "hello";
    
            bool sink = true;
    
            high_resolution_clock::time_point start, end;
            duration<double> timespan;
    
            int sizes[10] = { 10, 20, 40, 80, 160, 320, 640, 1280, 5120, 10240 };
    
            for(int s=0; s<10; ++s)
            {
                    std::cout << std::endl << "Generating " << haystacksCount << " random haystacks of size " << sizes[s] << std::endl;
                    for(size_t i=0; i<haystacksCount; ++i)
                    {
                            haystacks[i] = randomString(sizes[s]);
                    }
    
                    std::cout << "Starting std::string.find approach" << std::endl;
                    start = high_resolution_clock::now();
                    for(size_t i=0; i<haystacksCount; ++i)
                    {
                            if(haystacks[i].find(needle) != std::string::npos)
                            {
                                    sink = !sink; // useless action
                            }
                    }
                    end = high_resolution_clock::now();
                    timespan = duration_cast<duration<double>>(end-start);
                    std::cout << "Processing of " << haystacksCount << " elements took " << timespan.count() << " seconds." << std::endl;
    
                    std::cout << "Starting strstr approach" << std::endl;
                    start = high_resolution_clock::now();
                    for(size_t i=0; i<haystacksCount; ++i)
                    {
                            if(strstr(haystacks[i].c_str(), needle.c_str()))
                            {
                                    sink = !sink; // useless action
                            }
                    }
                    end = high_resolution_clock::now();
                    timespan = duration_cast<duration<double>>(end-start);
                    std::cout << "Processing of " << haystacksCount << " elements took " << timespan.count() << " seconds." << std::endl;
    
                    std::cout << "Starting std::search approach" << std::endl;
                    start = high_resolution_clock::now();
                    for(size_t i=0; i<haystacksCount; ++i)
                    {
                            if(std::search(haystacks[i].begin(), haystacks[i].end(), needle.begin(), needle.end()) != haystacks[i].end())
                            {
                                    sink = !sink; // useless action
                            }
                    }
                    end = high_resolution_clock::now();
                    timespan = duration_cast<duration<double>>(end-start);
                    std::cout << "Processing of " << haystacksCount << " elements took " << timespan.count() << " seconds." << std::endl;
            }
    
            return 0;
    }
    
    std::string randomString( size_t len)
    {
            static const char charset[] = "abcdefghijklmnopqrstuvwxyz";
            static const int charsetLen = sizeof(charset) - 1;
            static std::default_random_engine rng(std::random_device{}());
            static std::uniform_int_distribution<> dist(0, charsetLen);
            auto randChar = [charset, &dist, &rng]() -> char
            {
                    return charset[ dist(rng) ];
            };
    
            std::string result(len, 0);
            std::generate_n(result.begin(), len, randChar);
            return result;
    }
    

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

    #包括
    #包括
    #包括
    #包括
    int main()
    {
    std::string in=“Lorem ipsum door sit amet,concertetur adipising elit,”
    “临时性劳动和重大事故”;
    std::string needle=“pisci”;
    auto it=std::search(in.begin()、in.end(),
    标准::博伊尔摩尔搜索器(
    针。开始(),针。结束();
    if(it!=in.end())
    
    std::cout从C++23开始,您可以使用

    #包括
    const auto haystack=std::string(“带针的草垛”);
    常量自动指针=标准::字符串(“nee
    
    /*
    Every C++ program should have an entry point. Usually, this is the main function.
    Every C++ Statement ends with a ';' (semi-colon)
    But, pre-processor statements do not have ';'s at end.
    Also, every console program can be ended using "cin.get();" statement, so that the console won't exit instantly.
    */
    
    #include <string>
    #include <bits/stdc++.h> //Can Use instead of iostream. Also should be included to use the transform function.
    
    using namespace std;
    int main(){ //The main function. This runs first in every program.
    
        string input;
    
        while(input!="exit"){
            cin>>input;
            transform(input.begin(),input.end(),input.begin(),::tolower); //Converts to lowercase.
    
            if(input.find("name") != std::string::npos){ //Gets a boolean value regarding the availability of the said text.
                cout<<"My Name is AI \n";
            }
    
            if(input.find("age") != std::string::npos){
                cout<<"My Age is 2 minutes \n";
            }
        }
    
    }
    
    #include <string>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <random>
    #include <chrono>
    
    std::string randomString( size_t len );
    
    int main(int argc, char* argv[])
    {
            using namespace std::chrono;
    
            const size_t haystacksCount = 200000;
            std::string haystacks[haystacksCount];
            std::string needle = "hello";
    
            bool sink = true;
    
            high_resolution_clock::time_point start, end;
            duration<double> timespan;
    
            int sizes[10] = { 10, 20, 40, 80, 160, 320, 640, 1280, 5120, 10240 };
    
            for(int s=0; s<10; ++s)
            {
                    std::cout << std::endl << "Generating " << haystacksCount << " random haystacks of size " << sizes[s] << std::endl;
                    for(size_t i=0; i<haystacksCount; ++i)
                    {
                            haystacks[i] = randomString(sizes[s]);
                    }
    
                    std::cout << "Starting std::string.find approach" << std::endl;
                    start = high_resolution_clock::now();
                    for(size_t i=0; i<haystacksCount; ++i)
                    {
                            if(haystacks[i].find(needle) != std::string::npos)
                            {
                                    sink = !sink; // useless action
                            }
                    }
                    end = high_resolution_clock::now();
                    timespan = duration_cast<duration<double>>(end-start);
                    std::cout << "Processing of " << haystacksCount << " elements took " << timespan.count() << " seconds." << std::endl;
    
                    std::cout << "Starting strstr approach" << std::endl;
                    start = high_resolution_clock::now();
                    for(size_t i=0; i<haystacksCount; ++i)
                    {
                            if(strstr(haystacks[i].c_str(), needle.c_str()))
                            {
                                    sink = !sink; // useless action
                            }
                    }
                    end = high_resolution_clock::now();
                    timespan = duration_cast<duration<double>>(end-start);
                    std::cout << "Processing of " << haystacksCount << " elements took " << timespan.count() << " seconds." << std::endl;
    
                    std::cout << "Starting std::search approach" << std::endl;
                    start = high_resolution_clock::now();
                    for(size_t i=0; i<haystacksCount; ++i)
                    {
                            if(std::search(haystacks[i].begin(), haystacks[i].end(), needle.begin(), needle.end()) != haystacks[i].end())
                            {
                                    sink = !sink; // useless action
                            }
                    }
                    end = high_resolution_clock::now();
                    timespan = duration_cast<duration<double>>(end-start);
                    std::cout << "Processing of " << haystacksCount << " elements took " << timespan.count() << " seconds." << std::endl;
            }
    
            return 0;
    }
    
    std::string randomString( size_t len)
    {
            static const char charset[] = "abcdefghijklmnopqrstuvwxyz";
            static const int charsetLen = sizeof(charset) - 1;
            static std::default_random_engine rng(std::random_device{}());
            static std::uniform_int_distribution<> dist(0, charsetLen);
            auto randChar = [charset, &dist, &rng]() -> char
            {
                    return charset[ dist(rng) ];
            };
    
            std::string result(len, 0);
            std::generate_n(result.begin(), len, randChar);
            return result;
    }
    
    Generating 200000 random haystacks of size 10
    Starting std::string.find approach
    Processing of 200000 elements took 0.00358503 seconds.
    Starting strstr approach
    Processing of 200000 elements took 0.0022727 seconds.
    Starting std::search approach
    Processing of 200000 elements took 0.0346258 seconds.
    
    Generating 200000 random haystacks of size 20
    Starting std::string.find approach
    Processing of 200000 elements took 0.00480959 seconds.
    Starting strstr approach
    Processing of 200000 elements took 0.00236199 seconds.
    Starting std::search approach
    Processing of 200000 elements took 0.0586416 seconds.
    
    Generating 200000 random haystacks of size 40
    Starting std::string.find approach
    Processing of 200000 elements took 0.0082571 seconds.
    Starting strstr approach
    Processing of 200000 elements took 0.00341435 seconds.
    Starting std::search approach
    Processing of 200000 elements took 0.0952996 seconds.
    
    Generating 200000 random haystacks of size 80
    Starting std::string.find approach
    Processing of 200000 elements took 0.0148288 seconds.
    Starting strstr approach
    Processing of 200000 elements took 0.00399263 seconds.
    Starting std::search approach
    Processing of 200000 elements took 0.175945 seconds.
    
    Generating 200000 random haystacks of size 160
    Starting std::string.find approach
    Processing of 200000 elements took 0.0293496 seconds.
    Starting strstr approach
    Processing of 200000 elements took 0.00504251 seconds.
    Starting std::search approach
    Processing of 200000 elements took 0.343452 seconds.
    
    Generating 200000 random haystacks of size 320
    Starting std::string.find approach
    Processing of 200000 elements took 0.0522893 seconds.
    Starting strstr approach
    Processing of 200000 elements took 0.00850485 seconds.
    Starting std::search approach
    Processing of 200000 elements took 0.64133 seconds.
    
    Generating 200000 random haystacks of size 640
    Starting std::string.find approach
    Processing of 200000 elements took 0.102082 seconds.
    Starting strstr approach
    Processing of 200000 elements took 0.00925799 seconds.
    Starting std::search approach
    Processing of 200000 elements took 1.26321 seconds.
    
    Generating 200000 random haystacks of size 1280
    Starting std::string.find approach
    Processing of 200000 elements took 0.208057 seconds.
    Starting strstr approach
    Processing of 200000 elements took 0.0105039 seconds.
    Starting std::search approach
    Processing of 200000 elements took 2.57404 seconds.
    
    Generating 200000 random haystacks of size 5120
    Starting std::string.find approach
    Processing of 200000 elements took 0.798496 seconds.
    Starting strstr approach
    Processing of 200000 elements took 0.0137969 seconds.
    Starting std::search approach
    Processing of 200000 elements took 10.3573 seconds.
    
    Generating 200000 random haystacks of size 10240
    Starting std::string.find approach
    Processing of 200000 elements took 1.58171 seconds.
    Starting strstr approach
    Processing of 200000 elements took 0.0143111 seconds.
    Starting std::search approach
    Processing of 200000 elements took 20.4163 seconds.
    
    #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";
    }
    
    #include <string>
    
    const auto haystack = std::string("haystack with needles");
    const auto needle = std::string("needle");
    
    if (haystack.contains(needle))
    {
        // found!
    }