2010-06-11 128 views
348

在许多C++ IDE的和编译器,当它产生的主要功能对你来说,它看起来像这样:int argc,char * argv []是什么意思?

int main(int argc, char *argv[]) 

当我的代码C++没有一个IDE,只是一个命令行编译器,I型:

int main() 

没有任何参数。这是什么意思,对我的程序至关重要?

+35

如果你的程序将忽略命令行参数,那么你写的很好。如果你的程序需要处理命令行参数,那么IDE就是正确的。 – 2010-06-11 15:57:17

+17

提示黑客:尝试声明'int main(int argc,char * argv [],char * envp [])'并打印出最后一个参数。 ';)' – ulidtko 2015-10-05 11:17:59

+4

@ulidtko这是不好的,你是教新手在他们的程序中引入漏洞;) – 2016-04-27 12:29:00

回答

476

argvargc是如何将命令行参数传递给C和C++中的main()

argc将是由argv指向的字符串的数量。这将(实际上)为1加上参数的数量,因为实际上所有的实现都会在程序中加入数组名称。

的变量被命名为argc参数计数)和按照惯例argv参数向量),但是它们可以被赋予任何有效的标识符:int main(int num_args, char** arg_strings)是同样有效的。

如果您不打算处理命令行参数,它们也可以完全省略,产生int main()

试试下面的程序:

#include <iostream> 

int main(int argc, char** argv) { 
    std::cout << "Have " << argc << " arguments:" << std::endl; 
    for (int i = 0; i < argc; ++i) { 
     std::cout << argv[i] << std::endl; 
    } 
} 

./test a1 b2 c3将输出运行它

Have 4 arguments: 
./test 
a1 
b2 
c3 
+7

'argc'可以是0,在这种情况下'argv'可以是NULL。这是标准AFAIK允许的。我从来没有听说过这样做的系统,但它肯定可以存在,并且不会违反任何标准。 – Chuck 2010-06-11 15:56:33

+63

@Chuck:由于“argv [argc]'的值应为0”(C++ 03§3.6.1/ 2),因此'argv'不能为空。 – 2010-06-11 16:22:14

+0

@詹姆斯:哦,好点。我在想C,它对'main'有着微妙的规则。 – Chuck 2010-06-11 16:54:05

42

argc被传递到命令行程序和argv参数的数目是数组参数。

可以遍历的参数知道他们的数目喜欢:

for(int i = 0; i < argc; i++) 
{ 
    // argv[i] is the argument at index i 
} 
7

主参数表示提供给程序的命令行参数,当它被启动。 argc参数表示命令行参数的个数,char * argv []是表示命令行上提供的各个参数的字符串数组(字符指针)。

+2

Argv []始终将argv [arg]指定为空指针。并且Argv [0]始终是(完整路径)/ executableName作为nul结尾的字符串 – user3629249 2014-12-21 08:09:14

+2

@ user3629249:不一定; 'argv [0]'就是启动C程序的程序给它的'argv [0]'。在Bash的情况下,它通常(可能总是)可执行文件的路径名,但Bash不是执行其他程序的唯一程序。尽管古怪,但可以使用:char * args [] = {“cat”,“/ dev/null”,“/ etc/passwd”,0}; execv(“/ bin/ls”,args);'。在很多系统中,程序看到的值为'argv [0]',即使可执行文件是'/ bin/ls',也会是'cat'。 – 2016-02-05 03:36:33

5

第一个参数是提供的参数数量,第二个参数是表示这些参数的字符串列表。

+5

argv [0]中的第一个条目是程序名称,而不是参数 – user3629249 2014-12-21 08:10:08

1

两者的

int main(int argc, char *argv[]); 
int main(); 

是入口点C或C++程序的法律定义。 Stroustrup: C++ Style and Technique FAQ详细介绍了您的主要功能可能或合法的一些变体。

+2

可能要将void放在...'int main()'==>'int main(void)'...为了兼容性和可读性。我不知道是否所有旧版本的C都允许void函数在声明中有一个空的参数列表。 – dylnmc 2014-09-25 16:24:06

+1

@dylnmc这不会提供任何可读性增益,并且在所有C++版本中都完全相同。只有在C这有区别,但只在声明中,而不是在定义中。 – Ruslan 2015-05-05 09:35:09

+0

@Ruslan对不起,我刚刚学习C时发布了这个,我可能已经在C的早期版本中读过''void'是必需的。不要在此引用我的意思,我现在知道这是一个稍微愚蠢的评论。不过,它不会受伤。 – dylnmc 2015-05-07 01:41:44

5

main函数可以有两个参数,的argc的argvargc是一个整型参数,它是传递给程序的参数个数。

程序名称是总是第一个参数,所以会出现的至少一个参数的程序和的argc最小值将等于1。但是如果一个程序本身有两个参数值argc将是三。

参数的argv指向一个字符串数组,称为“参数向量”。它是函数参数的一维字符串数组。

+1

它也会有用:http://crasseux.com/books/ctutorial/argc-and-argv。html – moshtagh 2015-07-21 08:32:35

11

假设你这样运行程序(使用sh语法):

myprog arg1 arg2 'arg 3' 

如果你宣布你的主要为int main(int argc, char *argv[]),然后(在大多数环境中),您main()将被称为如果像:

p = { "myprog", "arg1", "arg2", "arg 3", NULL }; 
exit(main(4, p)); 

但是,如果你的声明作为主要int main(),它会被称为像

exit(main()); 

并且您没有获得传递的参数。

两个额外的事情需要注意:

  1. 这些是main仅有的两个标准的授权签名。如果一个特定的平台接受额外的参数或不同的返回类型,那么这是一个扩展,不应该依赖于便携式程序。
  2. *argv[]**argv完全相同,因此您可以将int main(int argc, char *argv[])写为int main(int argc, char **argv)
+1

如果我们在技术上,['basic.start.main/2'](https://timsong-cpp.github.io/cppwp/basic.start.main#2)明确允许实现定义的附加版本main()',只要实现提供了两个预定义的版本。所以,他们不是非常不合格。最常见的是'envp',它在C和C++中都非常出名,[它实际上是C标准J.5节(共同扩展)中的第一个条目](http://port70.net /~nsz/c/c11/n1570.html#J.5)。 – 2017-01-22 22:40:54

+0

谢谢你的美丽@Justin。答案更新更加正确。 – 2017-01-23 12:34:52

+0

@TobySpeight \t 如果argc <3返回错误,该怎么办?什么可能出错? – AVI 2017-12-04 15:50:44

1
int main(); 

这是一个简单的声明。它不能接受任何命令行参数。

int main(int argc, char* argv[]); 

当您的程序必须采用命令行参数时,会使用此声明。当运行像这样:

myprogram arg1 arg2 arg3 

argc,或参数计数,将被设置为4(四个参数),和argv,或参数向量,将与字符串指针为“myprogram”,“ARG1”来填充, “arg2”和“arg3”。 程序调用(myprogram)包含在参数中!

或者,你可以使用:

int main(int argc, char** argv); 

这也是有效的。

还有一个参数,您可以添加:

int main (int argc, char *argv[], char *envp[]) 

envp参数也包含环境变量。每个条目的格式如下:

VARIABLENAME=VariableValue 

这样的:

SHELL=/bin/bash  

环境变量列表是空值终止。

相关问题