jah*_*aho 0 c++ string stringstream stdvector
我有一个带有parse(int argc, char* argv[])函数的类,我必须使用它来设置对象的所需状态.我正在使用gui中的参数stringstream,然后我试图将它们转换为char**以将它们传递给函数.这是我得到的:
std::stringstream sstream;
sstream << "-clip" << " " << min_x_entry.get_text()
<< " " << max_x_entry.get_text(); // etc.
std::cout << sstream.str(); // All looks good here
std::vector<std::string> args;
std::vector<char*> argv;
std::string arg;
while (sstream >> arg)
{
args.push_back(arg);
argv.push_back(const_cast<char*>(args.back().c_str()));
}
argv.push_back(0);
int argc = args.size();
for (int i = 0; i < argc; ++i)
std::cout << &argv[0][i]; // This outputs garbage
my_object.parse(argc, &argv[0]) // And this fails
Run Code Online (Sandbox Code Playgroud)
我错过了什么?有没有更好的方法来实现这一目标?
问题是重新分配矢量,如果需要args,push_back()会增加矢量的大小:
如果new size()不大于capacity(),则不会使迭代器或引用失效.否则,所有迭代器和引用都将失效.
该argv矢量被存储指向在元件的内部args,所以它们将被无效.
解决方案是首先创建args向量,然后创建argv向量:
while (sstream >> arg) args.push_back(arg);
for (auto i = args.begin(); i != args.end(); i++)
{
argv.push_back(const_cast<char*>(i->c_str()));
}
argv.push_back(0);
Run Code Online (Sandbox Code Playgroud)
for打印出argv字符串的循环不正确.这个:
&argv[0][i]
Run Code Online (Sandbox Code Playgroud)
是一个char*但是从i第一个条目的元素开始argv.例如,如果第一个c字符串argv是"string":
&argv[0][1] is "tring"
&argv[0][2] is "ring"
Run Code Online (Sandbox Code Playgroud)
改成:
for (int i = 0; i < argc; i++)
std::cout << argv[i] << std::endl; // Added 'endl' to flush 'cout'.
Run Code Online (Sandbox Code Playgroud)