2014-10-07 129 views
0

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[] = { ... };

+6

实际上,你甚至没有数组来指针衰减。 'argv'确实是'char **'。但是你需要解决什么问题? – juanchopanza 2014-10-07 08:43:38

+1

'char * _argv [argc];'不是标准的C++,因为在C++中没有可变长度的数组。 – TNA 2014-10-07 08:54:49

回答

3

我看到的唯一的解决方法是使用一个可变长度数组是 不希望使用std::begin

唯一的解决方法是什么?没有问题。如果您确实需要一组string s,请使用vector,如TNAs答案中所示;我怀疑你需要修改参数。
如果您只需要遍历它,则不需要复制所有指针。

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'; 

的参数mainchar* argv[]衰减到char**,这是 不幸的,因为它不能与std::begin仅 接受阵列中使用。

没有其他办法。命令行参数的数量在编译时是未知的,并且这种传递它们的方法(而不是使用两个指针指针)历史上是有动机的。

+0

感谢您使用没有内存分配的解决方案。 – user4116340 2014-10-07 08:53:52

6

那是不可能的,因为主要的特征是固定的。您可以使用复制的元素到vector

std::vector<std::string> args {argv, argv + argc}; 

然后你就可以在args

+2

我已经意识到这一点。 – user4116340 2014-10-07 08:48:07

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; 
} 
相关问题