文字列の分割(split)|区切り文字/文字列に対応C++の文字列型std::stringには、split関数やsplitメンバ関数が定義されていないため、手動で文字列分割を行う必要があります。区切り文字の長さが2文字以上の場合には、文字列検索を活用した手作業による分割が必要になります。文字型(char)の値による分割を行う場合には、std::getline関数を活用したより簡潔な方法もあります。手動による文字列分割(様々な型の区切り文字に対応)find_first_ofの利用に注意するstd::getline関数を活用した文字列分割(char型の区切り文字にのみ対応)split関数の自作方法(文字列ポインタやbasic_string<T>の分割にも対応)正規表現によるスプリット処理を行いたい場合は以下の記事を参考にしてください。文字列クラスのfindメンバ関数で区切り文字の出現位置を判定し、その位置を元にsubstrメンバ関数で文字列を切り出していく方法です。分割された各文字列はstd::vector型のリストに随時追加しています。"c"}char型の文字や文字列ポインタによる分割を行いたい場合には以下の記述を利用します。std::char_traits<char>::length(separator);findメンバ関数はオーバロードに対応しているため、上記の変数separator、separator_lengthを先程のサンプルコードのものと置き換えるだけで動作します。find_first_ofの利用に注意する文字検索時にfindメンバ関数の代わりにfind_first_ofメンバ関数を用いる方法も知られていますが、文字型を受け取るfind_first_of(char)はfind(char)と同等の処理を行うため処理的な違いはなく、また処理速度の違いも発生しないことがほとんどです。find_first_ofに2文字以上の文字列を渡すこともできますが、この場合は文字集合による検索が行われることになるため注意が必要です。文字集合による検索時には、引数に渡した文字列に含まれるいずれかの文字が最初に出現した位置を返します。1(空白が最初に出現した位置)find_first_ofが用いられた区切り文字用の分割処理を、区切り文字列用に書き換える際には、findメンバ関数への書き換えが必要となります。できれば始めからfindを利用し、find_first_ofは使わないようにすることをオススメします。この場合の文字集合の仕様は思わぬ誤解やプログラムの不具合に繋がる恐れがあるためです。std::getline関数を活用した文字列分割std::getline関数は入力ストリームから行単位で文字列を読み込むための関数ですが、第三引数に区切り文字を指定することもできます。これを活用することで文字列分割の実現が可能となります。"c"}ただし、分割対象文字列の末尾が区切り文字だった場合には、意図した分割が行えなくなるため注意が必要です。"a"]という末尾空白が無視された結果が得られます。この問題への対処としては、分割対象文字列の末尾文字を手動判定する方法が考えられます。",a,b,,c,"他にも分割対象文字列の末尾にダミーの区切り文字を追加するテクニックが考えられます。v.push_back(buf);}この場合、空の文字列に対する分割を行った場合には空文字を格納したリスト({""})が得られるようになるという副作用が発生します。この挙動はECMAScriptのString.prototype.splitメソッドと同等のものです。"c"}という空文字を排除した形にすることもできます。"c"}split関数の自作方法std::string型の文字列分割を実現するsplit関数の実装例です。戻り値は分割された文字列を要素とするstd::vector<std::string>型のリストです。手動による文字列分割」の物と同等ですが、若干処理効率が良く、また汎用的な関数となっています。{""}第二引数には文字型や文字列型の区切り文字/区切り文字列を指定することが可能となっています。第三引数のignore_emptyは空文字の分割要素を除外するオプションです。第四引数のsplit_emptyは分割対象文字列と区切り文字列のいずれかが空文字だった際の挙動を制御するオプションです。区切り文字列の両者が空文字のケースでは空のリストを返します。区切り文字列のみが空文字のケースでは、分割対象文字列を一文字単位で分割します。split_emptyはignore_emptyオプションの影響を受けません。以下はstd::string限定の文字列分割関数です。v;}より汎用的な関数が必要な場合は、若干保守は面倒になりますが以下の実装を参考にしてみてください。配列型やポインタ型のNULL終端文字列に対する分割や、特定の要素型Tを持ったstd::basic_string<T>型に対する分割も可能となります。