2014-01-29 37 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

相关问题