【问题标题】:Why doesn't String* return all Strings?为什么 String* 不返回所有字符串?
【发布时间】:2018-12-11 15:47:00
【问题描述】:

以下代码是我在 C++98 中的项目的一部分,因此我不允许使用向量等。现在这个函数的主要用途是使用给定的delimeter 将单个字符串行分解为字符串数组,size 基本上是我需要返回的单词数。问题是当我调试并检查nums到最后时,它把它的大小更改为4,并且只返回第一个单词,由它的每个字符填充。好像nums现在是char*我有多次修改代码,但我不知道哪里出错了,有什么建议吗?

string* Split(string ss,char delimeter,int size)
{
    string *nums=new string[size];
    int index_c, index_sw=0;
    for (int i = 0; i < size; i++)
    {
        for(unsigned int j=0;j<ss.length();j++)
        {
            if (ss.at(j) == delimeter)
            {
                index_c = j;
                nums[i] = ss.substr(index_sw, index_c);
                index_sw += index_c;
                i++;
            }
        }
        break;
    }
    return nums;
}

【问题讨论】:

  • C++98 有向量。
  • nums 是指向数组中第一个元素的指针。调试器不知道它包含多少个元素,只能安全地假设它有 1 个。
  • 您的逻辑在这里看起来有缺陷...您的内部循环循环遍历整个字符串并将其很好地拆分,但是您将每个块放入数组的同一索引中。然后你增加你将要放入的索引并循环整个字符串再做一遍。
  • 我不明白外环的原因,也不知道你是怎么知道大小的。
  • 你的前提是错误的。使用std::vector,虽然这可能无法解决您的代码的所有问题

标签: c++ string pointers c++98


【解决方案1】:

由于事先不知道string ss 中的字数,所以在调用Split 函数时不能指定size。不知道size,您将无法为nums 分配内存。

所以你最好使用vectorstrings。正如所指出的,vector 在 C++98 中可用。

那么您修改后的Split 函数将如下所示:

vector<string> Split(string ss, char delimiter)
{
    vector<string> vs;
    int index_c, index_sw=0, j;

    for(j=0;j<ss.length();j++)
    {
        if (ss.at(j) == delimiter)
        {
            index_c = j;
            vs.push_back(ss.substr(index_sw, index_c - index_sw));                
            index_sw = index_c + 1;
        }
    }
    vs.push_back(ss.substr(index_sw, j - index_sw));        
    return vs;
}

然后可以这样调用:

vector<string> ret = Split("This is a stackoverflow answer", ' ');

查看演示here

【讨论】:

    猜你喜欢
    • 2014-10-23
    • 2017-09-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 2021-08-23
    • 2020-07-06
    • 2018-09-17
    • 2016-04-19
    相关资源
    最近更新 更多