はじめに
C++のstd::string
で、「ある文字列の中に、特定のキーワードが含まれているか」を調べたい場面は非常に多くあります。この目的のために、std::string
クラスには**.find()
**という強力なメンバ関数が用意されています。
.find()
は、文字列の中から指定した部分文字列を検索し、その開始位置(インデックス)を返します。もし、部分文字列が見つからなかった場合は、std::string::npos
という特別な値を返します。
この記事では、.find()
の基本的な使い方と、検索結果の判定方法について解説します。
.find()
を使ったサンプルコード
このコードは、与えられたテキストの中から"World"
という単語を検索し、見つかった場合と見つからなかった場合の両方の挙動を示します。
完成コード
#include <iostream>
#include <string>
using namespace std;
int main() {
string text = "Hello, beautiful World!";
string query1 = "World";
string query2 = "C++";
// --- 1. 見つかる場合の検索 ---
size_t position1 = text.find(query1);
// 戻り値が string::npos でないことを確認
if (position1 != string::npos) {
cout << "「" << query1 << "」が見つかりました。開始位置: " << position1 << endl;
} else {
cout << "「" << query1 << "」は見つかりませんでした。" << endl;
}
// --- 2. 見つからない場合の検索 ---
size_t position2 = text.find(query2);
if (position2 != string::npos) {
cout << "「" << query2 << "」が見つかりました。開始位置: " << position2 << endl;
} else {
cout << "「" << query2 << "」は見つかりませんでした。" << endl;
}
return 0;
}
実行結果
「World」が見つかりました。開始位置: 17
「C++」は見つかりませんでした。
コードの解説
.find(検索したい文字列)
- 機能:
string
オブジェクトの中から、引数で指定した部分文字列が最初に出現する位置を探します。 - 戻り値:
- 見つかった場合: その部分文字列の開始位置を示すインデックス番号(
size_t
型、0始まり)を返します。 - 見つからなかった場合:
std::string::npos
という特別な定数を返します。
- 見つかった場合: その部分文字列の開始位置を示すインデックス番号(
std::string::npos
とは?
npos
は “not a position”(位置ではない)の略で、std::string
クラスが持つ特別な静的メンバ定数です。これは非常に大きな符号なし整数の値で、「有効なインデックスではない」ことを示すために使われます。
検索が成功したかどうかを判定するには、.find()
の戻り値が**std::string::npos
と等しくないこと**を確認するのが定石です。 if (text.find(...) != string::npos)
C++20以降の .contains()
C++20では、単純に部分文字列が含まれているかどうかをtrue
/false
で知りたい、というより一般的なケースのために、**.contains()
**メンバ関数が追加されました。
// C++20以降
if (text.contains("World")) {
cout << "含まれています。" << endl;
}
.contains()
は内部的に.find()
を呼び出しており、より直感的で簡潔に記述できます。
まとめ
今回は、std::string
の.find()
メンバ関数を使って、部分文字列を検索する方法を解説しました。
- **
.find(文字列)
**で検索し、開始インデックスを取得する。 - 戻り値が
std::string::npos
かどうかで、検索が成功したかを判定する。 - C++20以降では、単純な存在確認には**
.contains()
**が便利。
.find()
には、検索を開始する位置を指定するオーバーロードなど、より高度な使い方もありますが、この基本的な形が最もよく使われます。