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 = ' '(a space)

预期结果:

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;
    }

相反,如果你is.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;
}

这是该算法的一个实时示例,可为您的测试字符串提供正确的输出。

请注意,您可以将其概括为使用字符串作为分隔符而不是单个字符,只需更改 的splitter第二个参数的类型(当然,传递" "而不是' ')。

于 2013-03-31T22:43:25.340 回答