0

私は C++ の初心者で、このコードのどこかで小さな間違いを犯したと思います。私はこれまでのところそれを見つけることができませんでした。あなたが私を助けてくれることを願っています、そしてそれがどのように/どこで/なぜ間違っているのか教えてください? よろしくお願いします。

コード:

std::vector<std::string> spliter(const std::string& s, char delimiter)
{
        std::vector<std::string> result;

        size_t start = 0;
        for(std::size_t i = 0; i != std::string::npos; i = s.find(delimiter,start))
        {
            result.push_back( s.substr(start,i-start) );
            start = i+1;
        }
        iprintf("\x1b[2J");
        printf("\x1b[4;0HDone Splitting Text.");
        swiWaitForVBlank();
        return result;
}

与えられたパラメータ: s = "$ 00-000 SS ''Prologue'' CF N00-001 V 1 MP 20" delimiter = ' '(スペース)

期待される結果:

result[0] = $
result[1] = 00-000
result[2] = SS
etc.

現在の間違った結果:

result[0] = 
result[1] = 
result[2] = 00-000
etc.

どんな助けでも大歓迎です!

4

2 に答える 2

2

問題はループにあると思います。0 から開始し、最初にプッシュするのは 0 から 0 です。

    size_t start = 0;
    for(std::size_t i = 0; i != std::string::npos; i = s.find(delimiter,start))
    {
        result.push_back( s.substr(start,i-start) );
        start = i+1;
    }

代わりに、それiから始めればうまくs.find(delimiter, start)いくはずです。例はこちら..

于 2013-03-31T22:42:44.007 に答える
1

アルゴリズムを修正する方法は次のとおりです。

#include <vector>
#include <string>

std::vector<std::string> spliter(const std::string& s, char delimiter)
{
    std::vector<std::string> result;

    std::string::size_type start = 0;
    auto pos = s.find(delimiter, 0);
    while (pos != std::string::npos)
    {
        result.push_back(s.substr(start, pos - start));
        start = pos + 1;
        pos = s.find(delimiter, start);
    }

    if (start < s.length())
    {
        result.push_back(s.substr(start));
    }

    return result;
}

テスト文字列に対して正しい出力を提供するこのアルゴリズムの実際のを次に示します。

の 2 番目の引数の型を変更するだけで (そしてもちろん の代わりにsplitter渡すだけで)、これを一般化して、単一の文字ではなく文字列を区切り文字として使用できることに注意してください。" "' '

于 2013-03-31T22:43:25.340 に答える