Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;字符串库错误:字符串下标超出范围 string*解析(string str,int from){ int i=0,n=0,j,k; i=j=from; 字符串*数据=新字符串[6]; while(str[i]){ 如果(str[i]=''){ 对于(k=0;k_C++_String_Vector - Fatal编程技术网

C++ C++;字符串库错误:字符串下标超出范围 string*解析(string str,int from){ int i=0,n=0,j,k; i=j=from; 字符串*数据=新字符串[6]; while(str[i]){ 如果(str[i]=''){ 对于(k=0;k

C++ C++;字符串库错误:字符串下标超出范围 string*解析(string str,int from){ int i=0,n=0,j,k; i=j=from; 字符串*数据=新字符串[6]; while(str[i]){ 如果(str[i]=''){ 对于(k=0;k,c++,string,vector,C++,String,Vector,而言,问题在于data数组的data[i]元素的长度都为零。这就是为什么赋值data[n][k]总是在data[n]的范围之外 解决此问题的一种方法是使用串联: 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
数组的
data[i]
元素的长度都为零。这就是为什么赋值
data[n][k]
总是在
data[n]
的范围之外

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

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;
}
更好的方法是完全消除循环,并使用
std::string
的成员函数:它允许您剪切
str
的一部分,知道所需的长度和起始位置

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

最后,当
str
不以空格结尾时,需要推送最后一个单词

以下是您使用上述建议修改的程序:

data[n] += str[j+k];
向量解析(字符串str,int from){ int i=from,j=from; 矢量数据; while(str[i]){ 如果(str[i]=''){ 数据推回(str.substr(j,i-j+1)); j=i+1; } i++; } 如果(j!=str.size()){ 数据。推回(str.substr(j)); } 返回数据; }

>这里是< < /P> <代码>数据< /代码>从<代码> 0 > /代码>长度开始,数据[n] [k]退出边界。<代码>数据[n] [k]=0 \ < /代码>不是正确使用C++字符串的方式,<>代码>字符串*/COD>被认为是不好的实践。 要按空格分隔字符串,请尝试:

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;
}
#包括
#包括
#包括
std::字符串数据(“hi”);
std::stringstream ss(数据);
字符串字;
std::向量v;
while(std::getline(ss,word,'))
{
v、 推回(单词);
}

确切的错误消息是什么?
data
以0长度开始,
data[n][k]
超出范围您是否尝试按空格分割字符串?是的,我尝试按空格分割。我不想使用其他字符libraries@MikeL这不是其他的库,它是标准的C++库。你使用C操作的方式失去了使用String的点可能是值得的,用String:find@kfsone你是对的,有一个为了更好地使用这个库,我想尽量保留OP的代码结构,所以我保持了原来的循环方式。
  #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);
  }