13

Boostなどのデフォルト以外のライブラリを使用せずに文字列入力をトークン化する簡単な方法を探しています。

たとえば、ユーザーがforty_fiveと入力した場合、区切り文字として_を使用して40と5を区切ります。

4

3 に答える 3

26

文字列をトークンのベクトルに変換するには(スレッドセーフ):

std::vector<std::string> inline StringSplit(const std::string &source, const char *delimiter = " ", bool keepEmpty = false)
{
    std::vector<std::string> results;

    size_t prev = 0;
    size_t next = 0;

    while ((next = source.find_first_of(delimiter, prev)) != std::string::npos)
    {
        if (keepEmpty || (next - prev != 0))
        {
            results.push_back(source.substr(prev, next - prev));
        }
        prev = next + 1;
    }

    if (prev < source.size())
    {
        results.push_back(source.substr(prev));
    }

    return results;
}
于 2012-04-07T04:49:51.877 に答える
1

strtok_r関数を使用できますが、manページを注意深く読んで、状態がどのように維持されるかを理解してください。

于 2012-04-07T04:21:55.753 に答える
1

このチュートリアルを見てください。これは、私がこれまでに見つけたトークン化に関する最高のチュートリアルです。C ++ stdでのgetline()find_first_of()の使用、Cでのstrtok()の使用など、さまざまなメソッドの実装におけるベストプラクティスについて説明します。

于 2013-04-02T14:09:25.983 に答える