2014-10-07 122 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; 
} 
相關問題