0

私はこのコードを持っています:

    while(fileStream>>help)
    {
        MyVector.push_back(help);
    }

...そしてファイル「fileStream」が1文であるとしましょう:今日は晴れた日です。今私がこれをするとき:

    for(int i=0;i<MyVector.size();i++)
    {
         printf("%s\n", MyVector[i]);
    }

、resoultは「日日日日日」です。そして、もちろん、それはそのようなものであってはなりません。変数は次のように宣言されます。

    char *help;
    vector<char*> MyVector;

編集:私は答えを理解しています、ありがとう...しかし、ファイルから単語を保存する方法はありますかvector<char*> MyVector(私が最初に望んでいたように)。それは私のプログラムの残りのために素晴らしいでしょう。

4

2 に答える 2

6

するとfileStream>>help、ポインタの値は変更されず、ポインタが指している文字列の内容が上書きされます。したがって、同じポインタをベクトルに何度も押し込んでいます。したがって、ベクトル内のすべてのポインタは同じ文字列を指します。そして、その文字列に最後に書き込まれたのは「日」という単語だったので、ベクトルの各要素を印刷すると、それが得られます。

std::string代わりに次のベクトルを使用してください。

string help;
vector<string> MyVector;

あなたが言うように、あなたが固執しなければならないなら、あなたはvector<char*>各要素に新しい文字列を動的に割り当てる必要があります。文字列に実際にどのくらいのスペースがあるかを知る方法がないため、 char*withを安全に使用することはできません。そのため、少なくとも入力には使用します。operator>>std::string

std::string help;
vector<char*> MyVector;

while (fileStream>>help) {
    char * p = new char[help.size() + 1];
    strcpy(p, help.c_str());
    MyVector.push_back(p);
}

もちろん、ベクターを使い終わったら、それをスコープから外すことはできません。ループ内のすべての要素を手動で削除する必要があります。ただし、これはまだ完全に安全ではありません。メモリ割り当てによって例外がスローされ、すでに割り当ててベクターに配置した文字列がリークする可能性があるためです。したがって、これをすべてtryブロックにまとめて、キャッチする準備をする必要がありますstd::bad_alloc

これはすべて面倒です。なぜあなたが使う必要があると思うのか説明できればvector<char*>、誰かがあなたが使わない理由を教えてくれるに違いありません。

于 2012-05-08T23:58:51.320 に答える
3

それはあなたchar *がすべて同じオブジェクトを指しているからです。ベクトルに格納されているhelpポインタとポインタはすべて同じオブジェクトを指しています。ストリームから読み取るたびに、すべてのポインターが指しているものが変更されます。に変更char*しますstd::string

于 2012-05-08T23:59:15.413 に答える