C++
 Computer >> コンピューター >  >> プログラミング >> C++

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()などを使った数値への変換も組み合わせることができます。

  1. 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オブジェクトが変更・破棄されるとポインタは無効になるため、あくまで参照用として使う点に注意してく

  2. C++で文字列をトークン化(分割)する2つの方法を解説

    文字列のトークン化(分割)とは、1つの文字列を区切り文字(スペースやカンマなど)を基準に、複数の部分文字列へ分割する処理のことです。C++では、標準ライブラリだけでもいくつかの方法で実現できます。本記事では、代表的な2つの方法をサンプルコード付きで紹介します。方法1:stringstreamを使って空白で分割する1つ目の方法は、stringstreamを使ってスペースで区切られた単語を順に読み取る方法です。この方法はやや制限がありますが、適切なチェックを加えれば十分に目的を果たすことができます。サンプルコード#include <vector> #include <string