5

私は宿題で立ち往生しています。ファイルからテキストを読み取り、各単語をメモリに割り当ててから、ポインタを使用してそれをに送信する必要がありvector<string*>ます。私のプログラムは、単に追加するのではなく、ファイルからの新しい単語でベクトルを上書きし続けます。なぜこれが起こっているのか理解できません。

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;


void WordFunctions(string *pstr, vector<string*> &words)
{
    words.push_back(pstr);
}
int main(){
    ifstream file;
    vector<string*> a;
    string word;
    int w =0;
    file.open("word.txt");
    while (!file.eof())
    {
        w++;
        file >> word;

        WordFunctions(&word, a);
    }
    file.close();

     for (int i=0;i<10;i++){
        cout<<(*a[i])<<" ";
        delete a[i];
    }

     system ("pause");
}
4

3 に答える 3

3

を使用するvector<string>か、ヒープに新しい文字列を割り当てます。

void WordFunctions(string *pstr, vector<string*> &words)
{
    words.push_back(new string(*pstr));
}
于 2012-11-01T23:39:34.450 に答える
1

同じ要素を単語のアドレスであるベクトルにプッシュしています。私はあなたのコードを少しマッサージします

// pass reference to eliminate copy
void WordFunctions(string &str, vector<string> &words)
{
    words.push_back(str);
}
int main(){
    ifstream file;
    vector<string> a;  // you want to store string not the address of the string
    string word;
    int w =0;
    file.open("words.txt");
    while (!file.eof())
    {
        w++;
        word.clear();   // clear the content before store something into it
        file >> word;
        WordFunctions(word, a);
    }
    file.close();

     for (size_t i=0;i<a.size();i++){  // use size instead of hard code magic number
        cout<<(a.at(i))<<" ";  // use at function instead of []
    }

     system ("pause");
}
于 2012-11-01T23:52:10.183 に答える
-1

文字列のメモリ内のアドレスは常に同じであるため、ループ内で文字列の値を変更しますが、その後、常に同じアドレスを彼に渡すようにword呼び出します。WordFunctions

vector<string*>の代わりに使用する制約がある場合vector<string>は、ループ内の新しい文字列にメモリを割り当て、そこに単語をコピーしてから、新しい参照をに渡す必要があります。WordFunctions

char *wordPtr

while (!file.eof())
{
    w++;
    file >> word;

    wordPtr = (char *)malloc((strlen(word)+1)*sizeof(char));
    strcpy(wordPtr, *word);

    WordFunctions(wordPtr, a);
}
于 2012-11-01T23:54:26.487 に答える