C++ でデリミタを使用して文字列を解析する方法

  1. 区切り文字を用いて文字列を解析するには find()substr() メソッドを用いる
  2. stringstream クラスと getline メソッドを用いてデリミタを用いて文字列を解析する
  3. 文字列を単一の空白区切り文字で解析するには copy() 関数を使う

この記事では、C++ でデリミタを指定して文字列を解析する方法を説明します。

区切り文字を用いて文字列を解析するには find()substr() メソッドを用いる

このメソッドは string クラスの組み込みの find メソッドを用いる。このメソッドは検索対象の文字列を string 型で受け取り、開始位置を整数値のパラメータとする。メソッドは渡された文字を見つけた場合、最初の文字の位置を返す。そうでなければ npos を返す。最後の区切り文字が見つかるまで string を繰り返し処理するために、while ループの中に find 文を入れる。区切り文字の間の部分文字列を抽出するには、substr 関数を用い、繰り返しのたびにトークンを words ベクトルにプッシュする。ループの最後のステップとして、erase メソッドを用いて文字列の処理部分を削除する。

#include <iostream>
#include <string>
#include <vector>

using std::cout; using std::cin;
using std::endl; using std::string;
using std::vector; using std::istringstream;

int main(){
    string text = "He said. The challenge Hector heard with joy, "
               "Then with his spear restrain'd the youth of Troy ";
    string delim = " ";
    vector<string> words{};

    size_t pos = 0;
    while ((pos = text.find(delim)) != string::npos) {
        words.push_back(text.substr(0, pos));
        text.erase(0, pos + delim.length());
    }

    for (const auto &w : words) {
        cout << w << endl;
    }
    return EXIT_SUCCESS;
}

出力:

He
said.
The
...
Troy

stringstream クラスと getline メソッドを用いてデリミタを用いて文字列を解析する

このメソッドでは、文字列変数 textstringstream に入れて getline メソッドで操作する。getline は与えられた char が見つかるまで文字を抽出し、そのトークンを string 変数に格納する。このメソッドは 1 文字の区切り文字が必要な場合にのみ適用できることに注意してください。

#include <iostream>
#include <string>
#include <vector>
#include <sstream>

using std::cout; using std::cin;
using std::endl; using std::string;
using std::vector; using std::stringstream;

int main(){
    string text = "He said. The challenge Hector heard with joy, "
               "Then with his spear restrain'd the youth of Troy ";
    char del = ' ';
    vector<string> words{};

    stringstream sstream(text);
    string word;
    while (std::getline(sstream, word, del))
        words.push_back(word);

    for (const auto &str : words) {
        cout << str << endl;
    }

    return EXIT_SUCCESS;
}

文字列を単一の空白区切り文字で解析するには copy() 関数を使う

copy()<algorithm> ライブラリ関数であり、指定された範囲の要素を反復処理してコピー先の範囲にコピーすることができる。まず、引数 textistringstream 変数を初期化します。その後、istream_iterator を利用して、空白で区切られた部分文字列をループさせ、最終的にコンソールに出力する。しかし、この解決策は string が空白区切り文字で分割される必要がある場合にのみ動作することに注意してください。

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <iterator>

using std::cout; using std::cin;
using std::endl; using std::string;
using std::vector; using std::istringstream;

int main(){
    string text = "He said. The challenge Hector heard with joy, "
               "Then with his spear restrain'd the youth of Troy ";

    istringstream iss(text);
    copy(std::istream_iterator<string>(iss),
         std::istream_iterator<string>(),
         std::ostream_iterator<string>(cout, "\n"));


    return EXIT_SUCCESS;
}

関連記事 - C++ String

  • C++で Char 配列を文字列に変換する方法
  • C++で文字列が数値かどうかを判断する方法
  • comments powered by Disqus