1

を分割する関数を作成しchar*ましvectorたが、問題は、このメソッドを実行した後、このすべての要素がvector入力行の最後の要素になることです。

例:

入力:abc def ghi

ベクター:ghi, ghi, ghi

vector <const char*> dane;
void split(char* str, char* sep){
    char* cstr = str;//str.c_str konwersja str na char*
    char* current;
    current = strtok(cstr, sep);
    string s;
    while(current != NULL){
        s = current;
        int foundF = s.find_first_not_of("-.\"-\\/!,`");
        int foundL =  s.find_last_not_of("-.\"-\\/!,`");
        if(foundL==string::npos)//find first or last zwrocilo nulla
            foundL = s.length();
        if(foundF==string::npos)
            foundF = 0;
        s = s.substr(foundF, foundL + 1);
        const char* c = s.c_str();
        dane.push_back(c);
        current=strtok(NULL, sep);
    }
}

int main(){
    char* c = new char[256];
    cin.getline(c,256);
    cout<<c<<endl;
    split(c, " ");
    for(int i  = 0; i < dane.size(); i++){
        cout<<dane.at(i)<<endl;
    }
    return 0;
}
4

1 に答える 1

3
const char* c = s.c_str();
dane.push_back(c);

s.c_str()常に同じ場所を指すことができるので、確かにこれはあなたが得たものになるかもしれません。私に関する限り、これは実装に依存するだけです-特定の文字列インスタンスが無効になった後(代入演算子の結果として)std::string、C const char ポインターの戻り値を保存して使用しています-私はあなたのプログラムを信じていますstring::c_str()未定義の動作を呼び出します。

行うべき変更:

vector<string> dane;

次に削除します

const char* c = s.c_str();

次に、次の行を次のように変更します

dane.push_back(s);

これで、部分文字列のコピーが (それらへのポインターがぶら下がっているのではなく) 作成され、正しい結果が出力されます。

于 2013-05-11T07:47:40.097 に答える