gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:56:25 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com