主char* argv[]
的参数衰减到char**
,这是不幸的,因为它不能与只接受数组的std::begin
一起使用。我看到的唯一解决方法是使用一个不可取的可变长度数组。
#include <iostream>
int main(int argc, char* argv[])
{
char* _argv[argc];
for (int i = 0; i < argc; ++i)
_argv[i] = argv[i];
for (arg : _argv)
{
std::cout << arg << " ";
}
return 0;
}
我希望我想要这样的东西:char* _argv[] = { ... };
答案 0 :(得分:6)
这是不可能的,因为main的签名是固定的。您可以使用以下内容将元素复制到vector
std::vector<std::string> args {argv, argv + argc};
然后,您可以在std::begin
args
答案 1 :(得分:5)
您可以定义一个简单的类包装器,为您提供begin()
和end()
。
struct Args {
int argc_;
char **argv_;
Args (int argc, char *argv[]) : argc_(argc), argv_(argv) {}
char ** begin () { return argv_; }
char ** end () { return argv_ + argc_; }
};
int main(int argc, char *argv[]) {
for (auto s : Args(argc, argv)) {
std::cout << s << '\n';
}
return 0;
}
答案 2 :(得分:3)
我看到的唯一解决方法是使用可变长度数组 不希望的。
确切的唯一解决方法是什么?没有问题。如果您确实需要一个string
的数组,请使用TNAs答案中显示的vector
;我怀疑你需要修改参数。
如果你只需要遍历它,就不需要复制所有指针。
for (auto str : boost::make_iterator_range(argv, argv + argc))
std::cout << str;
或
for (auto ptr = argv; ptr != argv + argc; ++ptr)
std::cout << *ptr << '\n';
main
char* argv[]
的参数衰减到char**
,即{。}} 不幸的是,因为它不能仅与std::begin
一起使用 接受数组。
没有其他办法。命令行参数的数量在编译时是未知的,并且这种传递它们的方法(而不是使用两个指针指向)是历史上的动机。