我有这段代码:
while(fileStream>>help)
{
MyVector.push_back(help);
}
...假设文件“fileStream”中有 1 个句子:今天是晴天。现在,当我这样做时:
for(int i=0;i<MyVector.size();i++)
{
printf("%s\n", MyVector[i]);
}
,结果是“day day day day day”。而且,当然,它不应该是那样的。变量声明如下:
char *help;
vector<char*> MyVector;
编辑:我明白了答案,谢谢...但是有什么方法可以将文件中的单词存储在 vector<char*> MyVector
中吗? (就像我一开始想要的那样)。这对我的程序的其余部分非常有用。
最佳答案
当你做 fileStream>>help
,这并没有改变指针的值,而是覆盖了指针指向的字符串的内容。所以你一遍又一遍地将同一个指针插入 vector 。所以 vector 中的所有指针都指向同一个字符串。由于最后写入该字符串的是单词“day”,因此当您打印出 vector 的每个元素时,您会得到这个单词。
使用 std::string
的 vector 相反:
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);
}
当然,当你用完 vector 后,你不能就让它离开作用域。您需要在循环中手动删除每个元素。然而,这仍然不是完全安全的,因为你的内存分配可能会抛出异常,导致你已经分配并放入 vector 中的任何字符串泄漏。所以你真的应该把这一切都放在一个 try block 中,并准备好捕捉 std::bad_alloc
.
这很麻烦。如果你能解释为什么你认为你需要使用 vector<char*>
,我敢打赌有人可以告诉你为什么你不这样做。
关于c++ - vector 值赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10508111/