我被困在家庭作业上。我必须从文件中读取文本,将每个单词分配给内存,然后使用指针将其发送到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");
}
答案 0 :(得分:3)
使用vector<string>
或在堆上分配新字符串:
void WordFunctions(string *pstr, vector<string*> &words)
{
words.push_back(new string(*pstr));
}
答案 1 :(得分: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");
}
答案 2 :(得分:-1)
你的word
字符串在内存中总是具有相同的地址,所以在循环中你改变了字符串的值,但是你调用WordFunctions
总是传递给他的地址。
如果使用vector<string*>
代替vector<string>
是一个约束,你可能需要为循环中的新字符串分配内存,复制你的单词然后将新引用传递给{{1 }}
WordFunctions