2013-10-11 50 views
0

可以說我想打開一個函數(它打開一個文件,用它做一些事情,然後把結果吐出到另一個文件中)。使用argv和argc,以及通過在線瀏覽所有教程,我假設如果我打印argv [0]我得到文件名。 我的問題是我如何設置讓下一個argv [1.2.n]來說一個函數。因此,如果用戶打開(在用戶進入程序目錄之後),它將打開該功能。 喜歡的東西:給函數分配命令行參數

void file(); 

...

if (argv[1] == open){ 
      file(); 
     } 
+0

您的描述還不是很清楚。你的程序應該接受什麼不同的參數,他們應該怎麼做?還要注意,argv [0]將包含程序的名稱 – codeling

+0

我相信你正在描述Python中所謂的參數解包。那是對的嗎? –

+0

@nyarlathotep:對於不清楚的問題,有[close-reason](http://meta.stackexchange.com/questions/184154/)。請使用它。 –

回答

0

argvchar*[](char *指針數組)的類型。您不能直接比較需要引用的字符串常量(類型char*)。相反,我建議你將它轉換爲C++字符串類型:

#include <string> 

void file(){ 
    // ... 
} 

int main(int argc, char *argv[]) { 
     if(argc>=2) 
     { 
       if(std::string(argv[1]) == "open") 
       { 
         file(); 
       } 

     } 
     else 
     { 
       // print usage 
     } 
} 
+0

'argv'是'char **'類型。在C++中不存在類型'* char []',並且'char * []'不能作爲函數參數的類型出現。 –

+0

@JamesKanze感謝您的評論。我會解決我的答案。 – jofel

0

參數傳遞給你的函數:

void file(int * argc, char * * argv) 
{ 
    // 
} 

int main(int argc, char * * argv) 
{ 
    if (argv[1] == open) 
    { 
    file(argc, argv); 
    } 
    return 0; 
} 
1

argv中的第一個字符串是不是第一個命令行參數,它通常是通往exe的路徑。我建議把命令行參數放在一個簡單的數據結構中。

vector<string> args(argv, argv + argc); 

現在,您可以將矢量傳遞給您的函數。

+0

根據標準,'argv [0]'應該是「用來調用程序的名字」,而不是' .exe'。當然,在實踐中,這在Unix中是不可實現的,你可以在'argv [0]'中得到任何東西。 –

0

這不太清楚你在問什麼。如果目標是 調用不同的功能取決於參數之一, 通常的解決辦法是使用地圖一個字符串的指針來 功能,然後像做:

MapType::const_iterator entry = map.find(argv[1]); 
if (entry == map.end()) { 
    std::cerr << "Unknown function " << argv[1] << std::endl; 
    returnCode = 1; 
} else { 
    (*entry->second)(); 
}