2014-01-29 51 views
3

在C++中我有一個主要功能與如何在main中指向char * argv []?

int argc, char * argv[] 

我需要另一個函數來訪問數據argv[](即參數)。

我將聲明一個全局變量,一個指向char **argv的指針。

我該怎麼做?

+8

只要將它作爲參數傳遞給第二個函數... –

+0

...或者只是將各個參數(例如'argv [1]','argv [2]'等)作爲單獨的'const char * '參數根據需要。 –

+0

一旦進入主char * argv []就像您創建的任何其他變量一樣。你可以傳遞給另一個功能,甚至改變內容等。 – Itachi

回答

6

應該避免全局變量,你應該更喜歡傳遞參數。無論如何,你可以只使用:

char **global_argv = NULL; 

int main(int argc, char * argv[]){ 
    ... 
    global_argv = argv; 
    ... 
} 

一個更好的辦法是:

void my_fun1(int argc, char **argv); // Passing all the program arguments 
void my_fun2(char *arg);    // Passing just the one you need 

int main(int argc, char * argv[]){ 
    ... 
    my_fun1(argc, argv); 
    my_fun2(argv[3]);     // Supposing you need the 3rd parameter (fourth on argv) 
    ... 
} 
+1

從來沒有任何理由使用全局變量。如果你不能將它作爲參數傳遞,出於某種奇怪的原因未知,那麼至少將'global_argv'聲明爲'static'。 – Lundin

11

在C++中,通常*處理argv最好的辦法是這樣的:

int main(int argc, char **argv) 
{ 
    std::vector<std::string> args(argv, argv + argc); 
} 

現在你具有args,正確構造的std::vectorargv的每個元素保存爲std::string。看不到醜陋的C型const char*

然後,您可以根據需要傳遞此向量或其某些元素。

*它攜帶內存&時間開銷動態分配每個argv字符串的一個副本。但是對於絕大多數程序來說,命令行處理並不是性能關鍵,而且增強的可維護性和穩健性非常值得。

+2

假設「最好」意味着最易讀和最易維護,而不是「在堆上分配的最小內存量」。您正在製作本地硬拷貝,消耗的內存量是所需內存的兩倍多,只是爲了提高源代碼的可讀性。 – Lundin

+1

@Lundin我會說它主要是增加可維護性;源代碼可讀性排在第二位。可維護性是代碼最重要的特性之一。是的,性能關鍵代碼有例外,但命令行處理可能不是其中之一。無論如何,我經常會猜想分配開銷將會被字符串處理所取代。但我並沒有否定你的觀點。我會略微削弱措詞。 – Angew

相關問題