1
string *parse(string str,int from){
int i=0,n=0,j,k;
i=j=from;
string *data=new string[6];
while(str[i]){
    if(str[i]==' '){
        for(k=0;k<(i-j-1);k++){
            data[n][k]=str[j+k]; << Error takes place here
        }
        data[n][k]='\0';
        j=i;
        n++;
    }
    i++;
}
return data;
}

谢谢你的帮助。我试图调试但没有成功,我错过了什么?

4

2 回答 2

2

问题是数组元素data[i]data长度都为零。这就是为什么赋值data[n][k]总是在data[n]' 范围之外的原因。

解决此问题的一种方法是使用串联:

data[n] += str[j+k];

更好的方法是完全消除循环,并改用substr成员函数std::string:它可以让你剪掉一部分str知道所需长度和起始位置的部分。

此外,您正在返回一个指向本地数组的指针,这是未定义的行为。您应该用 替换数组vector<string>,并使用 向其中添加项目push_back

str最后,当 the不以空格结尾时,您需要推动最后一个单词。

这是使用上述建议的修改后的程序:

vector<string> parse(string str,int from){
    int i=from, j=from;
    vector<string> data;
    while(str[i]){
        if(str[i]==' '){
            data.push_back(str.substr(j, i-j+1));
            j=i+1;
        }
        i++;
    }
    if (j != str.size()) {
        data.push_back(str.substr(j));
    }
    return data;
}

这是关于 ideone 的演示

于 2013-09-07T00:14:28.870 回答
1

data0长度开始,data[n][k] 越界。data[n][k]='\0'不是使用 C++ 字符串的正确方法,string *被认为是不好的做法。

要按空格分隔字符串,请尝试:

  #include <string>
  #include <vector>
  #include <sstream>

  std::string data("hi hi hi hi hi");
  std::stringstream ss(data);
  std::string word;

  std::vector<std::string> v;
  while(std::getline(ss, word, ' '))
  {
    v.push_back(word);
  }
于 2013-09-07T00:25:41.827 回答