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