C++:从stringstream到char**

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)

我错过了什么?有没有更好的方法来实现这一目标?

hmj*_*mjd 5

问题是重新分配矢量,如果需要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)