我正在尝试将一些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
答案 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;
}