C++:从字符串流到字符**

标签 c++ string stdvector stringstream

我有一个带有 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/

相关文章:

c++ - 二维边界框碰撞

c++ - 在 C++11 之前的版本中将字符串列表填充到 vector 中

c++ - 调试断言 : Vector iterators incompatible (C++)

c++ - 如何声明 std::vector of boost histograms ? boost 直方图的类型是什么?

c++ - static_pointer_cast<Derived> pReallyABase = static_pointer_cast<Derived>(pBase) 有效!为什么?

c++ - C++11 中的线程池

c++ - 为什么允许 "a.template foo<0>();"即使 "a.foo<0>();"已经足够了?

python - 如何在python中将字符串拆分成段

java - 如何修剪字符串的开头和结尾双引号?

c - 反转文件文本