【C++】std::string::findで文字列を検索する方法とnposの使い方

目次

はじめに

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()には、検索を開始する位置を指定するオーバーロードなど、より高度な使い方もありますが、この基本的な形が最もよく使われます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次