无法将C样式字符串推入std :: vector

时间:2015-03-29 18:50:23

标签: c++ vector c-strings

我正在尝试将一些const char*推入一个向量中,但在执行我想要填充它的操作后,该向量仍然未填充。

这是我的尝试,其中dict是我的命令行参数。

  

test.cc

#include <iostream>
#include <string>
#include <vector>
#include <fstream>

using namespace std;

int main(int argc, char **argv) 
{
  ifstream dict;
  size_t dict_size;

  dict.open(argv[1]); // Dictionary

  vector<const char*> dictionary; 

  string line;
  getline(dict, line);

  while(!dict.fail()) {
    dictionary.push_back(line.c_str());
    getline(dict, line);
  }

  dict_size = dictionary.size();

  for(int i = 0; i < dict_size; i++)
      cout << "dictionary[" << i << "] is " << dictionary[i] << endl;
}
  

字典

Hello
World
Foo
Bar

编译完成后,我得到以下输出:

dictionary[0] is 
dictionary[1] is 
dictionary[2] is 
dictionary[3] is 

但是,如果我将dictionary的类型更改为向量并推回line而不是line.c_str(),我会得到预期的输出:

dictionary[0] is Hello
dictionary[1] is World
dictionary[2] is Foo
dictionary[3] is Bar

我对C样式字符串并不十分熟悉,所以它可能与null终止有关吗?

请帮忙!

谢谢, erip

3 个答案:

答案 0 :(得分:3)

你正在存储悬空指针。

std::string::c_str()不是指向某些永久性数据副本的指针 - 只是想想,这会被泄露!

改为存储std::string

答案 1 :(得分:2)

您的代码调用未定义的行为,因为在您执行

之后
dictionary.push_back(line.c_str());

在指针可能被删除的下一行:

getline(dict, line); // line now is a different string

答案 2 :(得分:0)

您正在推进指向同一地址的字典指针,并在最后一次迭代时用空字符串填充内存区域。如果您不关心内存泄漏,可以尝试这样:

#include <iostream>
#include <string>
#include <vector>
#include <fstream>

using namespace std;

int main(int argc, char **argv) 
{
  ifstream dict;
  size_t dict_size;

  dict.open(argv[1]); // Dictionary

  vector<char *> dictionary; 

 while(!dict.fail()) {
 string * line = new string();
 getline(dict, *line);
 if(line->length()>0)
 {
   dictionary.push_back((char *)line->c_str());
 }
}

  dict_size = dictionary.size();

 for(int i = 0; i < dict_size; i++)
      cout << "dictionary[" << i << "] is " << dictionary[i] << endl;
}