C++で文字列をトークン化する方法:stringstreamとgetline()による分割テクニック
この記事では、C++における文字列のトークン化(分割)の方法について解説します。C言語では、文字配列に対してstrtok()関数を使用することで文字列を分割できましたが、C++ではstd::stringクラスを扱うため、少し異なるアプローチが必要です。
C++の機能を活用して文字列を分割するには、まずstd::stringをstringstream(文字列ストリーム)に変換します。その後、getline()関数を使うことで、指定した区切り文字(デリミタ)ごとに文字列を切り出すことができます。
getline()関数は、以下の3つの引数を受け取ります。
- 入力元となる文字列ストリーム
- 出力結果を格納する文字列変数
- 読み取りを停止する区切り文字
それでは、実際のコード例を見ながら、この仕組みがどのように動作するのかを確認してみましょう。
サンプルコード
#include <iostream>
#include <vector>
#include <sstream>
using namespace std;
int main() {
string my_string = "Hello,World,India,Earth,London";
stringstream ss(my_string); // my_stringを文字列ストリームに変換
vector<string> tokens;
string temp_str;
while(getline(ss, temp_str, ',')){ // カンマを区切り文字として文字列を分割
tokens.push_back(temp_str);
}
for(int i = 0; i < tokens.size(); i++) {
cout << tokens[i] << endl;
}
}実行結果
Hello World India Earth London
コードの解説
このプログラムでは、カンマ区切りの文字列「Hello,World,India,Earth,London」をstringstreamに渡し、whileループ内でgetline()を呼び出しています。getline()は区切り文字(この場合はカンマ)が見つかるたびに読み取りを止め、そこまでの部分文字列をtemp_strに格納します。ストリームの終端に達するとgetline()はfalseを返すため、ループが自動的に終了します。
分割された各トークンはvector<string>にpush_back()で追加され、最後にforループで順番に出力されます。この手法はCSV形式のデータ解析など、区切り文字で構成された文字列を処理する場面で非常に便利です。
-
C++のStringクラスat()メソッドの使い方を徹底解説
概要このチュートリアルでは、C++のStringクラスが提供するat()メソッドについて解説します。at()メソッドを使うことで、文字列内の任意の位置にある文字へアクセスできます。後半のセクションでは、実際のプログラミング例を通じて、at()関数による文字列操作の方法を詳しく学んでいきます。Stringクラスとはプログラミングにおける文字列とは、一般的にダブルクォーテーション()で囲まれた文字の集合を指します。Stringクラスはコンテナクラスの一種であり、イテレータや[]演算子を使ってすべての文字を順番に処理することができます。また、Stringクラスはメモリ管理やnull終端文字の処理など
-
C++で文字列をトークン化(分割)する2つの方法を解説
文字列のトークン化(分割)とは、1つの文字列を区切り文字(スペースやカンマなど)を基準に、複数の部分文字列へ分割する処理のことです。C++では、標準ライブラリだけでもいくつかの方法で実現できます。本記事では、代表的な2つの方法をサンプルコード付きで紹介します。方法1:stringstreamを使って空白で分割する1つ目の方法は、stringstreamを使ってスペースで区切られた単語を順に読み取る方法です。この方法はやや制限がありますが、適切なチェックを加えれば十分に目的を果たすことができます。サンプルコード#include <vector> #include <string