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]の範囲外になります。

これを修正する 1 つの方法は、連結を使用することです。

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

より良いアプローチは、ループを完全に削除し、代わりにsubstrメンバー関数を使用することです。これにより、目的の長さと開始位置を知ることのstd::string一部を切り取ることができます。str

さらに、未定義の動作であるローカル配列へのポインターを返しています。配列を に置き換え、vector<string>を使用して項目を追加する必要がありpush_backます。

str最後に、がスペースで終わらない場合は、最後の単語をプッシュする必要があります。

上記の提案を使用する変更されたプログラムは次のとおりです。

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 に答える