C++ でコンマ区切りの文字列シーケンスを解析する

胡金庫 2023年10月12日
  1. C++ で std::string::find および std::string::erase 関数を使用してカンマ区切りの文字列シーケンスを解析する
  2. std::getline 関数を使用して、カンマ区切りの文字列シーケンスを解析する
C++ でコンマ区切りの文字列シーケンスを解析する

この記事では、C++ でコンマ区切りの文字列シーケンスを解析する方法に関する複数の方法を示します。

C++ で std::string::find および std::string::erase 関数を使用してカンマ区切りの文字列シーケンスを解析する

std::find メソッドは、std::string クラスの組み込み関数であり、指定されたサブストリングの位置を見つけるために使用できます。この場合、検出される部分文字列を示す単一の引数を取ります。複数文字の文字列変数は、引数として渡すように初期化できます。ただし、次の例では、string を含む単一のコンマを宣言します。find メソッドは部分文字列の位置を返し、部分文字列が見つからない場合は string::npos を返すため、比較式を while ループに入れて、式が true と評価されるまで実行できます。

また、各反復で解析された文字列を vector コンテナに格納します。次に、erase メソッドが呼び出され、最初に見つかったコンマ区切り文字の前の文字が削除され、次の反復で同じ string オブジェクトの処理が続行されます。最後に、vector に格納されている要素を cout ストリームに出力します。

#include <algorithm>
#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 = "1,2,3,4,5,6,7,8,9,10";
  string delimiter = ",";
  vector<string> words{};

  size_t pos = 0;
  while ((pos = text.find(delimiter)) != string::npos) {
    words.push_back(text.substr(0, pos));
    text.erase(0, pos + delimiter.length());
  }
  for (const auto &str : words) {
    cout << str << endl;
  }

  return EXIT_SUCCESS;
}

出力:

1
2
3
4
5
6
7
8
9

std::getline 関数を使用して、カンマ区切りの文字列シーケンスを解析する

前の解決策は、コンマ区切りのシーケンスの最後の番号の抽出を見逃しています。したがって、前のコード例で条件付きチェックを追加するよりも、std::getline 関数を使用して次のメソッドを使用する方がよい場合があります。getline は、指定された入力ストリームから文字を読み取り、それらを string オブジェクトに格納します。この関数は、オプションの 3 番目の引数を取り、入力文字列を分割するための区切り文字を指定します。また、抽出した文字列は、後で使用できるように、反復ごとに std::vector コンテナに保存します。

#include <algorithm>
#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 = "1,2,3,4,5,6,7,8,9,10";
  char delimiter = ',';
  vector<string> words{};

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

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

  return EXIT_SUCCESS;
}

出力:

1
2
3
4
5
6
7
8
9
10
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

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

LinkedIn Facebook

関連記事 - C++ String