Проверьте, содержит ли строка строку в C ++ - PullRequest
410 голосов
/ 26 февраля 2010

У меня есть переменная типа std::string. Я хочу проверить, содержит ли он определенный std::string. Как бы я это сделал?

Есть ли функция, которая возвращает истину, если строка найдена, и ложь, если ее нет?

Ответы [ 10 ]

596 голосов
/ 26 февраля 2010

Используйте std::string::find следующим образом:

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

Примечание: "найдено!" будет напечатан, если s2 является подстрокой s1, s1 и s2 имеют тип std::string.

98 голосов
/ 26 февраля 2010

Вы можете попробовать использовать функцию find:

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

if (str.find(str2) != string::npos) {
//.. found.
} 
20 голосов
/ 23 июня 2014

На самом деле, вы можете попробовать использовать библиотеку boost, я думаю, что std :: string не предоставляет достаточно методов для выполнения всех распространенных строковых операций. В boost вы можете просто использовать boost::algorithm::contains :

#include "string"

#include "boost/algorithm/string.hpp"

using namespace std;
using namespace boost;
int main(){
    string s("gengjiawen");
    string t("geng");
    bool b = contains(s, t);
    cout << b << endl;
    return 0;
}
9 голосов
/ 02 июня 2015

Вы можете попробовать это

string s1 = "Hello";
string s2 = "el";
if(strstr(s1.c_str(),s2.c_str()))
{
   cout << " S1 Contains S2";
}
2 голосов
/ 09 октября 2016

Если вы не хотите использовать стандартные библиотечные функции, ниже приведено одно решение.

#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;
}
0 голосов
/ 08 июня 2019

Мы можем использовать этот метод вместо. Просто пример из моих проектов. Ссылайтесь на код. Некоторые дополнительные услуги также включены.

Посмотрите на операторы 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";
        }
    }

}
0 голосов
/ 13 мая 2019

Вы также можете использовать пространство имен System. Тогда вы можете использовать метод содержит.

#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";
    }
}
0 голосов
/ 04 мая 2018

Из такого большого количества ответов на этом сайте я не нашел четкого ответа, поэтому через 5-10 минут я сам понял его. Но это можно сделать в двух случаях:

  1. Либо вы ЗНАЕТЕ положение искомой строки в строке
  2. Либо вы не знаете позицию и ищите ее, char by char ...

Итак, давайте предположим, что мы ищем подстроку "cd" в строке "abcde" и используем простейшую встроенную функцию substr в 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;
}

для 2:

#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;
}
0 голосов
/ 21 августа 2017
#include <algorithm>        // std::search
#include <string>
using std::search; using std::count; using std::string;

int main() {
    string mystring = "The needle in the haystack";
    string str = "needle";
    string::const_iterator it;
    it = search(mystring.begin(), mystring.end(), 
                str.begin(), str.end()) != mystring.end();

    // if string is found... returns iterator to str's first element in mystring
    // if string is not found... returns iterator to mystring.end()

if (it != mystring.end())
    // string is found
else
    // not found

return 0;
}
0 голосов
/ 27 марта 2017

Это простая функция

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...