C++で文字列に文字列が含まれるか確認する
C++で文字列の中に特定の文字列が含まれているかどうかを調べる方法について説明します。
std::stringのfind()メソッドを使用する
std::string
クラスのfind()
メソッドは、指定された文字列が初めて出現する位置を返します。- 位置が
std::string::npos
(std::string
の定数)の場合、文字列は含まれていません。
#include <iostream>
#include <string>
int main() {
std::string str = "Hello, world!";
std::string substring = "world";
if (str.find(substring) != std::string::npos) {
std::cout << "Substring found." << std::endl;
} else {
std::cout << "Substring not found." << std::endl;
}
return 0 ;
}
std::string::nposについて
std::string::npos
は、std::string
クラスで定義されている定数です。find()
メソッドが文字列が見つからなかった場合に返される値です。- 実際には、
std::string::npos
は非常に大きな値(通常は-1
)であり、文字列内の有効なインデックスではありません。
find()
メソッドは、文字列が見つかった場合にその位置を返します。- この位置は、文字列内の有効なインデックスであるため、
0
以上の値になります。 - したがって、
find()
メソッドの戻り値がstd::string::npos
でない場合、文字列は含まれていることがわかります。
std::string::npos
の代わりに、0
と比較することもできます。- これは、文字列内の有効なインデックスは
0
以上であるためです。
if (str.find(substring) >= 0) {
// Substring found
} else {
// Substring not found
}
注意:
find()
メソッドは、文字列の最初の出現位置を返します。- すべての出現位置を検索する場合は、
find()
メソッドを繰り返し呼び出す必要があります。 - 大文字・小文字を区別しない検索を行う場合は、文字列をすべて大文字または小文字に変換してから検索する必要があります。
C++で文字列検索を行う例
#include <iostream>
#include <string>
int main() {
std::string str = "Hello, world!";
std::string substring = "world";
// find()メソッドを使用して、substringがstrに含まれているかどうかを調べる
size_t found = str.find(substring);
if (found != std::string::npos) {
std::cout << "Substring found at position: " << found << std::endl;
} else {
std::cout << "Substring not found ." << std::endl;
}
return 0;
}
size_t
:find()
メソッドの戻り値の型です。文字列内の位置を表す整数型です。
#include <iostream>
#include <string>
int main() {
std::string str = "Hello, world!";
std::string substring = "world";
// find()メソッドの戻り値が0以上であれば、substringはstrに含まれている
if (str.find(substring) >= 0) {
std::cout << "Substring found." << std::endl;
} else {
std::cout << "Substring not found." << std::endl;
}
return 0;
}
大文字・小文字を区別しない検索
#include <iostream>
#include <string>
#include <algorithm>
int main() {
std::string str = "Hello, World!";
std::string substring = "world";
// 文字列をすべて小文字に変換する
std::transform(str.begin(), str.end(), str.begin(), ::tolower);
std::transform(substring.begin(), substring.end(), substring.begin(), ::tolower);
// 大文字・小文字を区別せずに検索
if (str.find(substring) != std::string::npos) {
std::cout << "Substring found." << std::endl;
} else {
std::cout << "Substring not found." << std::endl;
}
return 0 ;
}
std::transform()
: 文字列の各文字を指定された関数で変換する関数です。::tolower()
: 文字を小文字に変換する関数です。
std::string::npos
は、文字列が見つからなかった場合にfind()
メソッドが返す値です。- この値は、通常は非常に大きな値であり、文字列内の有効なインデックスではありません。
find()
メソッドの戻り値が0
以上であれば、文字列は含まれていることがわかります。
#include <iostream>
#include <string>
int main() {
std::string str = "Hello, world!";
std::string substring = "world";
if (str.find(substring) >= 0) {
std::cout << "Substring found." << std::endl;
} else {
std::cout << "Substring not found." << std::endl;
}
return 0;
}
std::search()関数を使用する
std::search()
関数は、指定されたシーケンス(文字列)が別のシーケンス(文字列)に含まれているかどうかを検索します。std::search()
関数は、std::find()
関数よりも柔軟性があり、さまざまな検索条件を指定することができます。
#include <iostream>
#include <string>
#include <algorithm>
int main() {
std::string str = "Hello, world!";
std::string substring = "world";
if (std::search(str.begin(), str.end(), substring.begin(), substring.end()) != str.end()) {
std::cout << "Substring found." << std::endl;
} else {
std::cout << "Substring not found." << std::endl;
}
return 0;
}
std::find_if()関数を使用する
std::find_if()
関数は、指定された条件を満たす最初の要素を検索します。- 文字列検索の場合、条件として、文字列の各文字が指定された文字列の対応する文字と一致するかを判定することができます。
#include <iostream>
#include <string>
#include <algorithm>
int main() {
std::string str = "Hello, world!";
std::string substring = "world";
if (std::find_if(str.begin(), str.end(), [&substring](char c) {
return std::equal(substring.begin(), substring.end(), str.begin() + &c - &str[0]);
}) != str.end()) {
std::cout << "Substring found." << std::endl;
} else {
std::cout << "Substring not found." << std::endl;
}
return 0;
}
c++ string substring