main的参数

C语言规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv,argc(第一个形参)必须是整型变量,argv( 第二个形参)必须是指向字符串的指针数组。格式:

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

由于main函数不能被其它函数调用, 因此不可能在程序内部取得实际值。那么,在何处把实参值赋予main函数的形参呢?

实际上,main函数的参数值是从操作系统命令行上获得的。当我们要运行一个可执行文件时,在DOS提示符下键入文件名,再输入实际参数即可把这些实参传送到main的形参中去。在DOS下一条完整的运行命令包含2部分:命令与相应的参数。格式为:

1
命令 参数1 参数2 ... 

这种格式也叫命令行,命令行中的命令就是可执行文件的文件名,它后面的参数要用空格分隔,是对命令的进一步补充,即是传递给main()函数的参数。

其中整型argc表示命令行中字符串的个数,argc的值是在输入命令行时由系统按实际参数的个数自动赋予的。指针数组argv[]指向命令行中的各个字符串。这两个参数可以用任何合法的标识符命名,但是习惯采用argc和argv。

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main(int argc,char *argv[]){
int i=0;
printf("argc = %d\n",argc);
for(i = 0;i<argc;i++){
printf("argv[%d] = %s\n",i,argv[i]);
}
return 0;
}

编译后在命令行中执行:

1
template_arg.exe -a -b -c -d hello.txt

程序运行输出:

1
2
3
4
5
6
7
argc = 6
argv[0] = template_arg.exe
argv[1] = -a
argv[2] = -b
argv[3] = -c
argv[4] = -d
argv[5] = hello.txt

可见,argc为6,argv[0]为自身运行目录路径和程序名。
从argv[1]开始指向命令行中我们添加的参数。
这种形式带来的问题就是选项开关和其他参数(如文件名)之间分类不清(都是字符串),实现命令行参数位置的灵活和不出错,意味着在代码中解析命令行参数时要充分考虑可能出现的情况。

有些C程序员采用了一种约定,带’–’的参数,表示从这个参数开始,后面的参数都不是选项开关,即便它是以连字符开头。一种更好的解决办法是把包袱扔给系统而不是用户,使用参数处理器把参数分成选项开关和非选项开关两种,目前这种简单的argv机制由于使用的太广,因而不可能对它做任何修改。

main的返回值

在 C99 标准中,main函数只有以下两种定义方式是正确的:

1
2
int main( void ) 
int main( int argc, char *argv[])

void main()的用法是错误的。
main 函数的返回值类型必须是 int,返回值用于说明程序的退出状态。
如果返回0,则代表程序正常退出;返回其它数字的含义则由系统决定。
通常,返回非零代表程序异常退出。
如果 main 函数的最后没有写 return 语句的话,C99 规定编译器要自动在生成的目标文件中(如 exe 文件)加入return 0。
在 C89 中,main( ) 是可以接受的,也就是说 main()等同于int main(),不明确标明返回值的,默认返回值为int。