c++ - vector 值赋值

标签 c++ file vector

我有这段代码:

    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/

相关文章:

c++ - 如何将有向图(邻接表)传递给 Dijkstra 算法 boost 以找到最短路径?

file - Maven package 在 jar 包中打开一个文件(作为 *File*)

linux - 将文件从列表复制到文件夹

r - 更改元素 1 的位置 :2 in a vector

ios - 为 swift 2 中的按钮创建可缩放的三行菜单导航图标

c++ - vector 优化 - 简单方法

c++ - 如何找出两个图像之间的对象差异?

c++ - C++ 线程类中的错误导致它在退出时消耗 100% CPU

c++ - 如何将纹理应用于 OpenGL 中的子网格?

java - 文件 lastModified 与读取文件