本文へスキップ
BecomeCoder

C++コース · 第7章 std::string ― 文字列を自在に扱う · レッスン29

文字列の操作 ― 取り出す・探す・書き換える

ブラウザで完結

導入

std::string には、部分を取り出したり、位置を探したり、書き換えたりする便利なメソッドがそろっています。実務では文字列処理が本当によく出てくるので、代表的なものを押さえておきましょう。

説明

1文字ずつのアクセスは、配列と同じ [] か、範囲チェック付きの .at() で行います。部分文字列は .substr(開始, 長さ)、探すのは .find() です。

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s = "BecomeCoder";

    cout << s[0] << endl;             // B(添字アクセス)
    cout << s.substr(0, 6) << endl;   // Become(0文字目から6文字)
    cout << s.substr(6) << endl;      // Coder(6文字目から最後まで)

    size_t pos = s.find("Coder");     // 見つかった位置(なければ string::npos)
    if (pos != string::npos) {
        cout << "Coder は " << pos << " 文字目" << endl;  // 6 文字目
    }
    return 0;
}

代表的なメソッドを整理します。

flowchart LR
  s["string s"] --> a[".length() / .size()<br/>長さ"]
  s --> b[".substr(i, n)<br/>部分文字列"]
  s --> c[".find(x)<br/>位置を探す"]
  s --> d[".replace(i, n, x)<br/>置き換え"]
  s --> e[".push_back(c) / +=<br/>末尾に追加"]
  s --> f[".insert / .erase<br/>挿入・削除"]

書き換えは .replace()、途中への挿入は .insert()、削除は .erase() です。1文字追加は .push_back() でもできます。

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s = "I like C";
    s.replace(7, 1, "C++");    // 7文字目から1文字を "C++" に置き換え
    cout << s << endl;         // I like C++

    s.insert(0, ">> ");        // 先頭に挿入
    cout << s << endl;         // >> I like C++

    for (char c : s) {         // 1文字ずつ回す(範囲for)
        if (c == '+') cout << "プラス発見" << endl;
    }
    return 0;
}

まとめ

substr / find / replace / insert / erase を覚えると、たいていの文字列処理はできます。find が見つからないときは string::npos を返す、という点だけ注意しましょう。

実際に動かしてみよう

下のエディタにC++を書いて「コンパイル & 実行」を押すと、ブラウザ内で本物のC++コンパイラ(clang + libc++)がその場でコンパイルして実行し、出力が表示されます。std::string・vector・クラス・テンプレート・STL などモダンC++がそのまま動きます。本文の例を書き換えて試しながら進めましょう(初回だけコンパイラの読み込みに時間がかかります。以降はキャッシュされます。この回は標準入力(cin)は使わず、値はコードに直接書きます)。

C/C++ — ブラウザ内で本物のコンパイラで実行

ブラウザ内で本物のC/C++コンパイラ(clang + libc++ / WebAssembly)を動かします。構造体・malloc/free・std::string・vector・クラス・テンプレート・STL などがそのまま実行できます(初回のみコンパイラの読み込みに時間がかかります。以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。