C++で文字列をトークン化(分割)する2つの方法を解説
文字列のトークン化(分割)とは、1つの文字列を区切り文字(スペースやカンマなど)を基準に、複数の部分文字列へ分割する処理のことです。C++では、標準ライブラリだけでもいくつかの方法で実現できます。本記事では、代表的な2つの方法をサンプルコード付きで紹介します。
方法1:stringstreamを使って空白で分割する
1つ目の方法は、stringstreamを使ってスペースで区切られた単語を順に読み取る方法です。この方法はやや制限がありますが、適切なチェックを加えれば十分に目的を果たすことができます。
サンプルコード
#include <vector>
#include <string>
#include <sstream>
using namespace std;
int main() {
string str("Hello from the dark side");
string tmp; // 各ループで単語を一時的に格納する文字列
stringstream str_strm(str);
vector<string> words; // 単語を格納するためのvectorを作成
while (str_strm >> tmp) {
// ここでtmpが空でないかなどのチェックを行う
// また、!、.、?などの記号を取り除く処理も可能
// 最後にvectorへ追加する
words.push_back(tmp);
}
}このコードでは、抽出演算子(>>)を利用して、空白文字(スペース・タブ・改行)で区切られた単語を1つずつ読み込み、vector<string>に格納しています。実行後、wordsには「Hello」「from」「the」「dark」「side」の5つの単語が格納されます。
方法2:getline関数で区切り文字を指定して分割する
もう1つの方法は、getline関数を使ってカスタム区切り文字を指定し、文字列を分割する方法です。この方法を使えば、スペース以外の任意の文字(カンマ、セミコロンなど)を区切り文字として利用できます。
サンプルコード
#include <vector>
#include <string>
#include <sstream>
using namespace std;
int main() {
std::stringstream str_strm("Hello from the dark side");
std::string tmp;
vector<string> words;
char delim = ' '; // 分割に使う区切り文字を定義
while (std::getline(str_strm, tmp, delim)) {
// ここでtmpが空でないかなどのチェックを行う
// また、!、.、?などの記号を取り除く処理も可能
// 最後にvectorへ追加する
words.push_back(tmp);
}
}getline関数の第3引数に区切り文字を渡すことで、その文字が現れるたびに文字列を分割できます。例えば、delimを','に変更すれば、CSV形式のデータを簡単に分割することも可能です。
まとめ
単純に空白で文字列を区切るだけであれば、stringstreamの抽出演算子を使う方法が手軽です。一方、カンマなど特定の区切り文字で分割したい場合は、getline関数に区切り文字を指定する方法が便利です。用途に応じて適切な方法を選び、必要に応じて空文字列のチェックや記号の除去などの前処理を組み合わせるとよいでしょう。
-
C++のStringクラスat()メソッドの使い方を徹底解説
概要このチュートリアルでは、C++のStringクラスが提供するat()メソッドについて解説します。at()メソッドを使うことで、文字列内の任意の位置にある文字へアクセスできます。後半のセクションでは、実際のプログラミング例を通じて、at()関数による文字列操作の方法を詳しく学んでいきます。Stringクラスとはプログラミングにおける文字列とは、一般的にダブルクォーテーション()で囲まれた文字の集合を指します。Stringクラスはコンテナクラスの一種であり、イテレータや[]演算子を使ってすべての文字を順番に処理することができます。また、Stringクラスはメモリ管理やnull終端文字の処理など
-
C++で文字列をトークン化する方法:stringstreamとgetline()による分割テクニック
この記事では、C++における文字列のトークン化(分割)の方法について解説します。C言語では、文字配列に対してstrtok()関数を使用することで文字列を分割できましたが、C++ではstd::stringクラスを扱うため、少し異なるアプローチが必要です。C++の機能を活用して文字列を分割するには、まずstd::stringをstringstream(文字列ストリーム)に変換します。その後、getline()関数を使うことで、指定した区切り文字(デリミタ)ごとに文字列を切り出すことができます。getline()関数は、以下の3つの引数を受け取ります。入力元となる文字列ストリーム出力結果を格納する文