web-dev-qa-db-ja.com

文字列にC++の文字列が含まれているか確認する

std::string型の変数があります。特定のstd::stringが含まれているかどうかを確認したいです。どうすればいいの?

文字列が見つかるとtrueを返し、見つからないとfalseを返す関数はありますか?

399
neuromancer

次のように std::string::find を使用します。

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

注:「見つかりました」 s2s1の部分文字列である場合、s1s2は両方ともstd::string型です。

584
Matthieu N.

find 関数を使ってみることができます。

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

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

実際には、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;
}
20
Geng Jiawen

あなたはこれを試すことができます

string s1 = "Hello";
string s2 = "el";
if(strstr(s1.c_str(),s2.c_str()))
{
   cout << " S1 Contains S2";
}
10
HappyTran

標準のライブラリ関数を使用したくない場合は、以下の解決策があります。

#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;
}
4
Testing123

これは単純な関数です

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;
}
0
neda

このウェブサイトの非常に多くの答えから、私は明確な答えを見つけることができませんでしたので5-10分で私はそれを自分で答えを考え出しました。しかしこれは2つの場合ですることができます:

  1. _ know _ 文字列内で検索する部分文字列の位置
  2. あなたのどちらか わからない /位置とそれを探す、char by char ...

それでは、文字列 "abcde"で部分文字列 "cd"を検索し、C++で最も単純な substr 組み込み関数を使用するとしましょう。

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
user7655194

System名前空間を使用することもできます。その後、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";
    }
}
0
Malindu Dilanka