2012-05-08 11 views
0

を割り当てます。今私がこれをするとき:ベクトル値は、私は、コードのこの部分を持っている

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

、resoultは "日の日の日の日"です。もちろん、それはそうではありません。私は、答えを理解していただきありがとうございます...しかし、(私は最初の場所に望んでいたように)vector<char*> MyVectorにファイルから単語を格納するためにどのような方法があります:

char *help; 
    vector<char*> MyVector; 

EDITを:変数は、このように宣言されています。それは私のプログラムの残りの部分にとって素晴らしいことです。

+1

'std :: vector 'を使うのは、四角いペグを丸い穴にはめ込むようなものですが、一緒にはフィットしません。 –

答えて

6

fileStream>>helpを実行すると、それはポインタの値を変更していないため、ポインタが指している文字列の内容を上書きしています。そのため、同じポインタをベクトルに何度も繰り返しています。したがって、ベクトル内のポインタはすべて同じ文字列を指します。そして、その文字列に書き込まれた最後のものが "day"という単語だったので、それはあなたがベクトルの各要素を出力するときに得られるものです。

ではなくstd::stringのベクトルを使用します。

string help; 
vector<string> MyVector; 

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

もちろん、ベクターを使用すると、範囲外に出ることはできません。ループ内のすべての要素を手動で削除する必要があります。しかし、これはまだ完全に安全ではありません。なぜなら、メモリの割り当てによって例外がスローされ、既に割り当てられた文字列がベクトルに漏れてしまいます。だから、あなたは本当にこれをtryブロックに入れて、std::bad_allocをキャッチする準備ができているはずです。

これはすべて面倒です。 vector<char*>を使用する必要があると思われる理由を説明できる場合は、誰かがあなたになぜあなたがいないのかを示すことができます。

+0

私は理解しています、ありがとう...しかし、ベクトルのファイルから単語を格納する方法はありません MyVector(私が最初に欲しかったように)。それは私のプログラムの残りの部分にとって素晴らしいことです。 – user1069738

+1

@ user1069738、 'c_str()'を使って何か問題がありますか? – chris

+0

ありがとうございます:) – user1069738

3

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

関連する問題