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

胡金庫 2023年10月12日
  1. 区切り文字を用いて文字列を解析するには find()substr() メソッドを用いる
  2. stringstream クラスと getline メソッドを用いてデリミタを用いて文字列を解析する
  3. 文字列を単一の空白区切り文字で解析するには copy() 関数を使用する
C++ でデリミタを使用して文字列を解析する方法

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

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

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

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

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

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 <sstream>
#include <string>
#include <vector>

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

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 <iterator>
#include <sstream>
#include <string>
#include <vector>

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

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;
}
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ String