23

重複の可能性:
C++で文字列を分割する

PHPでは、explode()関数は文字列を取得し、指定された区切り文字で各要素を区切る配列に切り刻みます。

C ++に同等の機能はありますか?

4

2 に答える 2

36

簡単な実装例を次に示します。

#include <string>
#include <vector>
#include <sstream>
#include <utility>

std::vector<std::string> explode(std::string const & s, char delim)
{
    std::vector<std::string> result;
    std::istringstream iss(s);

    for (std::string token; std::getline(iss, token, delim); )
    {
        result.push_back(std::move(token));
    }

    return result;
}

使用法:

auto v = explode("hello world foo bar", ' ');

注:出力イテレーターに書き込むという@Jerryの考え方は、C++ではより慣用的です。実際、両方を提供できます。最大限の柔軟性を実現するための、出力イテレーターテンプレートとベクトルを生成するラッパー。

注2:空のトークンをスキップする場合は、を追加しif (!token.empty())ます。

于 2012-10-19T03:36:30.563 に答える
12

標準ライブラリには直接同等のものは含まれていませんが、作成するのはかなり簡単です。C ++であるため、通常は配列に具体的に書き込む必要はありません。むしろ、通常は出力をイテレータに書き込み、配列、ベクトル、ストリームなどに送信できるようにします。この一般的な順序で何か:

template <class OutIt>
void explode(std::string const &input, char sep, OutIt output) { 
    std::istringstream buffer(input);

    std::string temp;

    while (std::getline(buffer, temp, sep))
        *output++ = temp;
}
于 2012-10-19T03:36:47.173 に答える