gpt4 book ai didi

c++ - 将命令行参数 int argc 和 char** argv 替换为 std::vector

转载 作者:行者123 更新时间:2023-12-01 18:03:48 24 4
gpt4 key购买 nike

已关注 this post ,我在那里找到了 my other problem 的临时解决方法,我想知道是否可以替换 int argc, char** argvstd::vector<std::string>变量/对象。

考虑虚构的代码:

#include <iostream>
#include <CloseLibrary>

void someFunction(int argc, char** argv){
for (int i = 0; i < argc; ++i) {
std::cout << argv[i] << std::endl;
}
}

int myFunc(int argc, char** argv){
someFunction(argc, argv);

return 0;
}

其中 CloseLibrary是一个封闭的库,我无法访问源代码,并且 someFunction该库中的函数需要 int argc, char** argv命令行参数。但对于some reason我不能有双指针 char**在我的代码中。

Here in this post提出了类似我需要的东西,但我不知道如何使用它。我可以这样写代码吗:

#include <iostream>
#include <CloseLibrary>
#include <vector>

void someFunction(int argc, char** argv){
for (int i = 0; i < argc; ++i) {
std::cout << argv[i] << std::endl;
}
}

int myFunc("args", [](std::vector<std::string> args){
std::vector<char *> cstrs;
cstrs.reserve(args.size());
for (auto &s : args) cstrs.push_back(const_cast<char *>(s.c_str()));
someFunction(cstrs.size(), cstrs.data());

return 0;
}

或者也许有更规范的方法来做到这一点?如果您能帮助我找到正确的方法并理解解决方案,我将不胜感激。感谢您提前提供的帮助。

P.S.1.char* argv[]方法在函数体中可以,但在输入中不行。我不知道为什么 pybind11 这样做!

P.S.2. Here on pybind11 gitter ,这是建议:

void run(const std::vector<std::string>& args) {
for(auto&& e : args) std::cout << e << '\n';
}

P.S.3. 还建议在 pybind11 Gitter 上使用:

char** argv = new char*[vec.size()]; // just like malloc(sizeof(char*)*vec.size());
for (int i = 0; i < vec.size(), i++) {
argv[i] = new char[vec[i].size()];
memcpy(argv[i], vec[i].data(), vec[i].size()); // or strcpy
}

最佳答案

您可以使用从给定范围初始化 vector 的构造函数,其中 argv 参数充当起始迭代器,argv+argc 充当结束迭代器。

例如,我通常以以下方式开始我的主要功能:

int main( int argc, char* argv[] )
{
std::vector< std::string > args( argv, argv + argc );

for ( auto s : args )
{
std::cout << s << std::endl;
}
}

请注意,这还将捕获第一个参数 (argv[0]),该参数通常(但不一定)在启动时保存应用程序的名称。

在您的情况下,您希望执行相反的操作,从 std::vector< std::string > 构建一个连续的 char* 数组。我会做类似的事情:

std::vector< char* > rargs( args.size(), 0 ); // Initialize N nullptrs.
for ( int i=0; i<args.size(); ++i )
{
std::strcpy( rargs[i], args[i].c_str() ); // One-by-one strcpy them
}

然后你可以将它们传递到接受 argc、argv 的函数中

someFunction( rargs.size(), rargs.data() );

关于c++ - 将命令行参数 int argc 和 char** argv 替换为 std::vector<std::string>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60040665/

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