如何在主函数中指向 char *argv[]?

3
在C++中,我有一个主函数,其中包含

  int argc, char * argv[]

我需要在另一个函数中访问argv[]中的数据(即参数)。

我将声明一个全局变量,指向char ** argv的指针。

我该怎么做?


8
把它作为参数传递给这个第二个函数就可以了。 - Luchian Grigore
或者根据需要将单独参数(例如argv[1]argv[2]等)作为单独的const char * 参数传递。 - Paul R
一旦你进入主函数,char *argv[] 就像你创建的任何其他变量一样。你可以将它传递给其他函数甚至修改其内容等。 - Itachi
我该怎么做?如何将char * argv[]传递给函数? - user3247608
将原型声明为 function(char **, some-other types),并将其用作 function(argv, some-other variable) - noufal
2个回答

12

C++中,通常*处理argv的最佳方式是:

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

现在你有了一个正确构造的std::vector,名为args,其中包含每个argv元素作为一个std::string。不再有丑陋的C风格的const char*

然后,您可以根据需要直接传递此向量或其某些元素。

* 它带来了动态分配每个argv字符串副本的内存和时间开销。但是对于绝大多数程序而言,命令行处理并不关乎性能,而提高可维护性和鲁棒性则非常值得。


2
假设“最佳”意味着最易读和最易维护,而不是“在堆上分配的最少内存量”。你正在制作本地硬拷贝,消耗了超过所需内存两倍以上,只是为了增加源代码的可读性。 - Lundin
1
@Lundin 我认为主要是提高可维护性;源代码的可读性其次。而可维护性是代码最重要的品质之一。是的,有些性能关键的代码会有例外,但命令行处理可能不是其中之一。我猜通常分配开销会被字符串处理所超越。但我并不否认你的观点;我会稍微减弱措辞。 - Angew is no longer proud of SO

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接