C++でカンマ区切りのstd::stringを解析して分割する方法
本記事では、C++でカンマ区切りの文字列(カンマで区切られたstd::string)を解析する方法を解説します。カンマで区切られた複数のテキストを含む文字列を用意し、プログラムを実行すると、それらをvector型のオブジェクトに分割して格納します。
文字列の分割には、getline()関数を使用します。この関数の基本的な構文は以下のとおりです。
getline (input_stream, string, delim)
この関数は、入力ストリームから文字列や1行を読み取るために使われます。第3引数のdelimに区切り文字を指定することで、その文字を境界として文字列を切り出すことができます。
入力:文字列 "ABC,XYZ,Hello,World,25,C++" 出力:分割された文字列 ABC XYZ Hello World 25 C++
アルゴリズム
処理の流れは以下のステップになります。
ステップ1:与えられた文字列からストリームを作成する ステップ2:ストリームが終端に達するまで繰り返す ステップ2.1:カンマの直前までの項目を取得する ステップ2.2:その項目をvectorに追加する ステップ3:vectorを返す
サンプルコード
#include<iostream>
#include<vector>
#include<sstream>
using namespace std;
main() {
string my_str = "ABC,XYZ,Hello,World,25,C++";
vector<string> result;
stringstream s_stream(my_str); // 文字列からstringstreamを作成
while(s_stream.good()) {
string substr;
getline(s_stream, substr, ','); // カンマ区切りで文字列を取得
result.push_back(substr);
}
for(int i = 0; i<result.size(); i++) { // 分割した文字列をすべて表示
cout << result.at(i) << endl;
}
}実行結果
ABC XYZ Hello World 25 C++
コードのポイント
まず、元の文字列からstringstreamオブジェクトを作成します。これにより、文字列を入力ストリームとして扱えるようになります。次に、good()メソッドでストリームの状態を確認しながらループ処理を行い、getline()に区切り文字としてカンマ','を渡すことで、1つずつ要素を取り出します。取り出した各要素はpush_back()でvectorに追加していきます。
この手法は、CSV形式のデータ処理など、区切り文字で構成された文字列を扱う場面で非常に便利です。なお、より高度な実装では、末尾に余分な空要素が生成されるケースへの対処や、std::stoi()などを使った数値への変換も組み合わせることができます。
-
C++でstd::stringをconst char*やchar*に変換する方法
C++でstd::stringの中身をC言語形式の文字列として扱いたい場面は多くあります。読み取り専用のconst char*として取得する場合は、stringクラスが提供するc_str()メソッドを使うのが最も簡単です。一方、内容を変更できるchar*が必要な場合は、新しくメモリを確保して文字列をコピーする必要があります。c_str()でconst char*を取得するc_str()メソッドは、文字列の内容と終端のヌル文字(\0)を含むconst char*へのポインタを返します。元のstringオブジェクトが変更・破棄されるとポインタは無効になるため、あくまで参照用として使う点に注意してく
-
C++で文字列をトークン化(分割)する2つの方法を解説
文字列のトークン化(分割)とは、1つの文字列を区切り文字(スペースやカンマなど)を基準に、複数の部分文字列へ分割する処理のことです。C++では、標準ライブラリだけでもいくつかの方法で実現できます。本記事では、代表的な2つの方法をサンプルコード付きで紹介します。方法1:stringstreamを使って空白で分割する1つ目の方法は、stringstreamを使ってスペースで区切られた単語を順に読み取る方法です。この方法はやや制限がありますが、適切なチェックを加えれば十分に目的を果たすことができます。サンプルコード#include <vector> #include <string