-4

出于某种奇怪的原因,原本打算拆分为各种其他字符串并使用分隔符放置在向量字符串中的原始字符串不能很好地工作。而且我似乎找不到我的错误。

#include <iostream>
#include <vector>
#include <string>

using namespace std;

vector<string> split(string target, string delimiter);

int main()
{
    split ("1,2,3,4,5",",");
    return 0;
}

vector<string> split(string target, string delimiter)
{
    vector<string> word;
    string letter;
    int i = 0;
    int k = 0;

    while (target[i] != '\0')
    {
        word.empty();
        word.push_back("target");
        while (target[i] != delimiter[0])
        {
            letter = target[i];
            i++;
        }
        word[i]=letter;
        i++;

    }
    return (word);
}
4

1 回答 1

0

第一个问题是,当您调用 时split,第二个参数是一个包含单个空格的字符串,但您要拆分的字符串用逗号分隔。为了完整起见, H2CO3在评论部分已经提到的其他问题在下面突出显示。

  1. 在 while 循环的每次迭代期间,您都在清空向量。
  2. 您在每次迭代期间添加字符串“target”。
  3. 您正在向向量添加一个字母。相反,您应该添加整个字符串。
  4. 您没有考虑到分隔符和您提取的单个字符串可能大于单个字符。
  5. 匹配字符串中分隔符的整体逻辑是错误的(至少对于您当前实现它的方式)。您只是比较第一个字符,如果这是所需的行为,请将类型更改delimiterstring::value_type
  6. 本身不是问题,但我建议通过const引用而不是通过值传递字符串,因为split不需要或复制任何一个。

下面的示例应该可以帮助您更好地理解如何利用标准库中已经存在的功能。它使用find和的substr成员函数,std::string而不是直接直接访问数据。我建议您在继续之前std::vectorstd::string之前查看文档。

std::vector<std::string>
    split(const std::string& target, const std::string& delimiter)
{
    std::vector<std::string> word;
    size_t start = 0;

    for(;;)
    {
        size_t loc = target.find(delimiter, start);

        if(loc == std::string::npos)
        {
            word.push_back(&target[start]);
            break;
        }

        word.push_back(target.substr(start, loc - start));
        start += (loc - start) + delimiter.size();
    }

    return (word);
}
于 2013-05-26T19:21:44.477 回答