目次
はじめに
C++でstd::string
を扱う際、「文字列の先頭から5文字だけ取り出したい」「3文字目から4文字分を抜き出したい」といった、部分文字列を抽出したい場面は非常に多くあります。
この目的のために、std::string
クラスには .substr()
というメンバ関数が用意されています。.substr()
を使えば、開始位置と文字数を指定して、文字列の一部を新しい std::string
オブジェクトとして簡単に取り出すことができます。
.substr()
を使ったサンプルコード
このコードは、.substr()
の主要な使い方(オーバーロード)を3つのパターンで示します。
完成コード
#include <iostream>
#include <string>
using namespace std;
int main() {
string text = "Hello, Modern C++";
cout << "元の文字列: \"" << text << "\"" << endl;
cout << "--------------------------" << endl;
// 1. 引数なし: 全体をコピー
string sub1 = text.substr();
cout << "substr(): " << sub1 << endl;
// 2. 引数1つ: 指定した位置から最後までを抽出
// インデックス7 (文字'M') から最後まで
string sub2 = text.substr(7);
cout << "substr(7): " << sub2 << endl;
// 3. 引数2つ: 指定した位置から、指定した文字数を抽出
// インデックス0 ('H') から、5文字分
string sub3 = text.substr(0, 5);
cout << "substr(0, 5): " << sub3 << endl;
return 0;
}
実行結果
元の文字列: "Hello, Modern C++"
--------------------------
substr(): Hello, Modern C++
substr(7): Modern C++
substr(0, 5): Hello
コードの解説
.substr(開始位置, 文字数)
- 機能: 文字列オブジェクトから、指定された部分文字列を新しい
std::string
オブジェクトとして返します。元の文字列は変更されません。 - 引数:
- 第1引数
開始位置
(pos): 抽出を開始する文字のインデックス番号(0始まり)。この引数を省略することはできません(ただし、引数なしのオーバーロードは存在します)。 - 第2引数
文字数
(count): 抽出する文字の数。この引数を省略した場合、開始位置から文字列の最後までが抽出対象となります。
- 第1引数
各パターンの動作
text.substr()
: 引数がないように見えますが、これはtext.substr(0)
と同じ意味で、0番目から最後まで、つまり文字列全体のコピーを返します。text.substr(7)
: インデックス7(8番目の文字'M'
)から、文字列の最後までを抽出します。text.substr(0, 5)
: インデックス0から、5文字分を抽出します。
まとめ
今回は、C++のstd::string
から部分文字列を抽出する.substr()
メンバ関数について解説しました。
.substr(開始位置)
: 開始位置から最後までを抽出。.substr(開始位置, 文字数)
: 開始位置から指定した文字数分を抽出。- インデックスは
0
始まり。
.substr()
は、文字列を解析したり、必要な部分だけを取り出したりと、文字列操作において最も基本的で頻繁に使われる関数の一つです。