[解決済み】C++で文字列区切り文字を使ったパース(分割)(標準C++)について)
2022-03-23 22:38:41
質問
C++で以下のように文字列をパースしています。
using namespace std;
string parsed,input="text to be parsed";
stringstream input_stringstream(input);
if (getline(input_stringstream,parsed,' '))
{
// do some processing.
}
1文字のデリミタでパースするのは問題ありません。しかし、文字列をデリミターとして使いたい場合はどうすればよいのでしょうか。
例 分割したい。
scott>=tiger
と
>=
をデリミタとして、scottとtigerを取得できるようにしました。
どのように解決するのですか?
を使用することができます。
std::string::find()
関数を使って文字列の区切り文字の位置を調べ、次に
std::string::substr()
でトークンを取得します。
例
std::string s = "scott>=tiger";
std::string delimiter = ">=";
std::string token = s.substr(0, s.find(delimiter)); // token is "scott"
-
は
find(const string& str, size_t pos = 0)
の最初の出現位置を返します。str
文字列の中で、またはnpos
文字列が見つからない場合 -
は
substr(size_t pos = 0, size_t n = npos)
関数は、オブジェクトの部分文字列を返します。pos
で、長さがnpos
.
複数のデリミタがある場合、あるトークンを抽出した後、それを(デリミタを含めて)削除することで以降の抽出を進めることができます(元の文字列を保持したい場合は、単に
s = s.substr(pos + delimiter.length());
):
s.erase(0, s.find(delimiter) + delimiter.length());
こうすることで、各トークンを取得するためのループを簡単に作ることができます。
完全な例
std::string s = "scott>=tiger>=mushroom";
std::string delimiter = ">=";
size_t pos = 0;
std::string token;
while ((pos = s.find(delimiter)) != std::string::npos) {
token = s.substr(0, pos);
std::cout << token << std::endl;
s.erase(0, pos + delimiter.length());
}
std::cout << s << std::endl;
出力します。
scott
tiger
mushroom
関連
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] リストを均等な大きさの塊に分割するには?
-
[解決済み] 文字列をfloatやintにパースするにはどうしたらいいですか?
-
[解決済み] Bashで文字列をデリミターで分割するには?
-
[解決済み] Javaで文字列を分割する方法
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++