我有一个带有 parse(int argc, char* argv[])
函数的类,我必须使用它来设置对象的所需状态。我正在使用 stringstream
从 gui 获取参数,然后尝试将它们转换为 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
我错过了什么?有没有更好的方法来实现这一目标?
最佳答案
一个问题是将 args
vector 重新分配为 push_back()
如果需要,将增加 vector 的大小:
If new size() is not larger than capacity(), no iterators or references are invalidated. Otherwise all iterators and references are invalidated.
argv
vector 正在存储指向 args
中元素内部的指针,因此这些元素将失效。
一个解决方案是先创建 args
vector ,然后再创建 argv
vector :
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);
打印出 argv
字符串的 for
循环不正确。这:
&argv[0][i]
是一个 char*
但从 argv
中第一个条目的第 i
个元素开始。例如,如果 argv
中的第一个 C 字符串是 "string"
:
&argv[0][1] is "tring"
&argv[0][2] is "ring"
更改为:
for (int i = 0; i < argc; i++)
std::cout << argv[i] << std::endl; // Added 'endl' to flush 'cout'.
关于C++:从字符串流到字符**,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11209311/