我有这段代码:
while(fileStream>>help)
{
MyVector.push_back(help);
}
...并且让我们说文件“fileStream”是1句:今天是晴天。现在当我这样做时:
for(int i=0;i<MyVector.size();i++)
{
printf("%s\n", MyVector[i]);
}
,重新开始是“日日活动日”。而且,当然,它应该是那样的。变量声明如下:
char *help;
vector<char*> MyVector;
编辑:我理解答案,谢谢......但是有没有办法在vector<char*> MyVector
中存储文件中的文字(就像我想要的那样)。这对我的其他计划来说会很棒。
答案 0 :(得分:6)
当你执行fileStream>>help
时,它不会改变指针的值,它会覆盖指针所指向的字符串的内容。所以你一遍又一遍地将同一个指针推入向量。因此,向量中的所有指针都指向相同的字符串。因为写入该字符串的最后一件事是“day”这个词,所以当你打印出vector的每个元素时,这就是你得到的。
使用std::string
的向量代替:
string help;
vector<string> MyVector;
如果如你所说,你必须坚持使用vector<char*>
,那么你必须为每个元素动态分配一个新的字符串。您无法安全地将char*
与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*>
,我打赌有人可以告诉你为什么你不这样做。
答案 1 :(得分:3)
那是因为你的char *
都指向同一个对象。 help
指针和存储在向量中的指针都指向同一个对象。每次从流中读取时,它都会修改所有指针指向的内容。将char*
更改为std::string
。