2016-10-05 68 views
1

嗨非常新手的問題,但我就是想不通:創建的argc argv的

我有一個函數名爲bar

class foo 
{ 
    public: 
     bool bar(int argc, char** argv); 
} 

的argv應該包含

"--dir" and "/some_path/" 

如何創建argv和argc以便我可以將它們傳遞給bar()?我已經嘗試了很多方法,但我無法獲得指針和類型轉換的權利。

因此,我不想從命令行獲取argv,而是想在代碼中創建它。

感謝您的任何意見!

+0

創建?沒有!你可以通過argv將參數傳遞給你的程序。 argc是傳入參數的數量。argv可以容納任何值,路徑... – Raindrop7

+0

@ Raindrop7,有時你必須在程序中創建argc和argv。例如,如果你想使用增強單元測試,你最終會調用main。在android上(如果你想在設備上運行測試),你必須自己調用它,你必須爲它形成參數。 –

回答

5

我喜歡的方式是這樣的:

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。通常情況並非如此。

+1

再次從'const char *'到'char *'的隱式轉換。 – Slava

+0

我已經做出明確的轉換,並增加了有關UB的通知。 –

+1

對於C++ 11,您可以不使用任何強制轉換,而使用左值引用和'&arg [0]'。無論如何,我寧願'const_cast <>'而不是C風格的演員。 – Slava

0

假設你想argc和在傳遞給main相同的格式ARGV,你可以這樣調用:

foo f; 
char *args[] = { 
    (char*)"--dir", 
    (char*)"/some_path/", 
    NULL 
}; 
f.bar(2, args); 

(注:這是假定bar不會修改參數字符串 - 其中情況下,你應該參數類型更改爲char **const char **代替)

+2

從const char *轉換爲char *'在C++中是非法的 – Slava

+0

segfault!沒有分配給argv – Raindrop7

+0

@Slava不,事實並非如此。如果通過轉換顯式進行轉換,則在所有版本的C++中都有效。在C++ 11之前,轉換也可以隱含地執行,但只適用於字符串文本(這個答案有)。只有嘗試修改指向的字符串是無效的。 – hvd

0

使用string類是太強大:

#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; 
}