命令行参数使用两种约定来传递参数的数量:
- 它被明确地传入
argc
-
argv 数组包含一个空指针作为其最后一个(有用的)元素
您可以为const char * 构造一个字符串,代码可以很简单:
std::vector<std::string> convert_arguments(int argc, char **argv) {
std::vector<std::string> command_arguments;
for (int i=0; i<argc; i++) {
command_arguments.push_back(std::string(argv[i]));
}
return command_arguments;
}
或(第二个约定):
std::vector<std::string> convert_arguments(int argc, char **argv) {
std::vector<std::string> command_arguments;
for (const char **ix=argv; ix!=nullptr; ix++) {
command_arguments.push_back(std::string(*ix++));
}
return command_arguments;
}
如果你想为测试构建这样一个数组,你可以很容易地从文字字符串中做到这一点:
const char *const_argv[] = { "foo", "fee", "bar", "baz", nullptr}; // add the last null
int my_argc = sizeof(my_argv)/sizeof(*my_argv) - 1; // but do no count it
char ** my_argv = const_cast<char **>(const_argv); // cast it
注意:此代码正确地将 const_argv 声明为指向 const 字符的指针数组,因为字符串文字是 const,并且使用 const_cast 能够将其传递给上述函数.这是无害的,因为该函数从不尝试更改其参数,但规则是应尽可能避免使用 const_cast。
如果你真的需要一个非 const 字符串数组,你必须先构建字符串,然后再构建数组:
char a1[] = "foo";
char a2[] = "fee";
char a3[] = "bar";
char a4[] = "baz";
char *argv[] = {a1, a2, a3, a4, nullptr};