【问题标题】:C++ Properly split text on charC ++在char上正确拆分文本
【发布时间】:2013-03-31 22:34:56
【问题描述】:

我对 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" 分隔符 = ' '(一个空格)

预期结果:

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

当前错误结果:

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

非常感谢任何帮助!

【问题讨论】:

  • 你能看到在你的循环中第一次,你在推回s.substr(0,0)吗?
  • 等等,在第一个循环发生之前没有设置'i'?尽管如此,它并没有解释丢失的 '$' 字符。
  • 你看到this问题的答案了吗?您的代码看起来有点相似。
  • @Smileynator i 设置为 0start 设置为 0。也许您最初打算将i 设置为s.find(delimiter,start)
  • 这让我很困惑,我应该坚持使用普通的 for 循环而不是尝试这种花哨的东西

标签: c++ vector split delimiter


【解决方案1】:

我相信问题出在循环中。你从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;
    }

如果你从 s.find(delimiter, start) 开始 i 它应该可以工作。 Example here..

【讨论】:

    【解决方案2】:

    这是修复算法的一种可能方法:

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

    这是该算法的live example,为您的测试字符串提供正确的输出。

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

    【讨论】:

    • 这个完美!由于我的编译器的工作方式,我不得不将 'auto' 更改为 'std::size_t',但这很棒!正如 Drew 和 vidit 告诉我的那样,我将花一些时间来分析到底出了什么问题。再次感谢!
    • @Smileynator:好的,很高兴它有帮助。此外,如果您不/不能使用auto,那么要使用的确切类型应该是std::string::size_type。大多数情况下,这与std::size_t 相同,但为了安全起见,请使用std::string::size_type
    • 我注意到,'size_t' 似乎也能正常工作!我发现这种方式也更容易阅读。下次我不会使用这样的 for 循环。只会造成混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多