在代码中创建 argc argv
create argc argv in the code
嗨,新手问题,但我就是想不通:
我有一个名为 bar 的函数
class foo
{
public:
bool bar(int argc, char** argv);
}
argv 应该包含
"--dir" and "/some_path/"
如何创建 argv 和 argc 以便我可以将它们传递给 bar() ?我已经尝试了很多方法,但我就是无法正确获得指针和类型转换。
所以我不想从命令行获取 argv,而是想在代码中创建它。
感谢您的任何意见!
假设您想要传递给 main
的相同格式的 argc 和 argv,您可以这样调用它:
foo f;
char *args[] = {
(char*)"--dir",
(char*)"/some_path/",
NULL
};
f.bar(2, args);
(注意:这假定 bar
不会修改参数字符串 - 在这种情况下,您应该将参数类型更改为 const char **
而不是 char **
)
我最喜欢的方式是这样的:
std::vector<std::string> arguments = {"--dir", "/some_path"};
std::vector<char*> argv;
for (const auto& arg : arguments)
argv.push_back((char*)arg.data());
argv.push_back(nullptr);
f.bar(argv.size() - 1, argv.data());
请注意,如果参数是静态的并且不会改变,那么这就有点矫枉过正了。但这种方法具有符合 RAII 标准的优点。它为您管理内存并在适当的时候删除对象。所以如果参数列表是动态的,那么它是最干净的方式。
除此之外,如果 f.bar
修改 argv 数组中的数据,此代码在技术上是 UB。通常情况并非如此。
使用class字符串太强大了:
#include <iostream>
#include <string>
class foo
{
public:
void bar(int argc, std::string* argv);
};
void foo::bar(int argc, std::string* argv)
{
//do somwthing
for(int i(0); i < argc; i++)
std::cout << "argv[" << i << "]: " << argv[i] << std::endl;
}
int main()
{
int argc;
std::cout << "Enter number of parameters: ";
std::cin >> argc;
std::cout << std::endl;
std::cin.ignore(1, '\n');
std::string* sArgv = new std::string[argc];
for(int i(0); i < argc; i++)
{
std::cout << "argv[" << i << "]: ";
std::getline(std::cin, sArgv[i]);
std::cout << std::endl;
std::cin.ignore(1, '\n');
}
foo theFoo;
theFoo.bar(argc, sArgv);
delete[] sArgv;
sArgv = NULL;
std::cout << std::endl;
return 0;
}
嗨,新手问题,但我就是想不通:
我有一个名为 bar 的函数
class foo
{
public:
bool bar(int argc, char** argv);
}
argv 应该包含
"--dir" and "/some_path/"
如何创建 argv 和 argc 以便我可以将它们传递给 bar() ?我已经尝试了很多方法,但我就是无法正确获得指针和类型转换。
所以我不想从命令行获取 argv,而是想在代码中创建它。
感谢您的任何意见!
假设您想要传递给 main
的相同格式的 argc 和 argv,您可以这样调用它:
foo f;
char *args[] = {
(char*)"--dir",
(char*)"/some_path/",
NULL
};
f.bar(2, args);
(注意:这假定 bar
不会修改参数字符串 - 在这种情况下,您应该将参数类型更改为 const char **
而不是 char **
)
我最喜欢的方式是这样的:
std::vector<std::string> arguments = {"--dir", "/some_path"};
std::vector<char*> argv;
for (const auto& arg : arguments)
argv.push_back((char*)arg.data());
argv.push_back(nullptr);
f.bar(argv.size() - 1, argv.data());
请注意,如果参数是静态的并且不会改变,那么这就有点矫枉过正了。但这种方法具有符合 RAII 标准的优点。它为您管理内存并在适当的时候删除对象。所以如果参数列表是动态的,那么它是最干净的方式。
除此之外,如果 f.bar
修改 argv 数组中的数据,此代码在技术上是 UB。通常情况并非如此。
使用class字符串太强大了:
#include <iostream>
#include <string>
class foo
{
public:
void bar(int argc, std::string* argv);
};
void foo::bar(int argc, std::string* argv)
{
//do somwthing
for(int i(0); i < argc; i++)
std::cout << "argv[" << i << "]: " << argv[i] << std::endl;
}
int main()
{
int argc;
std::cout << "Enter number of parameters: ";
std::cin >> argc;
std::cout << std::endl;
std::cin.ignore(1, '\n');
std::string* sArgv = new std::string[argc];
for(int i(0); i < argc; i++)
{
std::cout << "argv[" << i << "]: ";
std::getline(std::cin, sArgv[i]);
std::cout << std::endl;
std::cin.ignore(1, '\n');
}
foo theFoo;
theFoo.bar(argc, sArgv);
delete[] sArgv;
sArgv = NULL;
std::cout << std::endl;
return 0;
}