参考博客
https://blog.csdn.net/abc_xixi111/article/details/79993899
https://www.cnblogs.com/flypig666/p/11805430.html
一.main()函数参数
通常我们在写主函数时都是void main()或int main() {..return 0;},但ANSI-C(美国国家标准协会,C的第一个标准ANSI发布)在C89/C99中main()函数主要形式为:
(1).int main(void)
(2).int main(int argc,char *argv[]) = int main(int argc,char **argv).
其参数argc和argv用于运行时,把命令行参数传入主程序.其中ARG是指arguments,即参数.具体含义如下:
(参照Arguments to main和C++ Primer7.2.6节)
(1).int argc:英文名为arguments count(参数计数)
count of cmd line args,运行程序传送给main函数的命令行参数总个数,包括可执行程序名,其中当argc=1时表示只有一个程序名称,此时存储在argv[0]中.
(2).char **argv:英文名为arguments value/vector(参数值)
pointer to table of cmd line args,字符串数组,用来存放指向字符串参数的指针数组,每个元素指向一个参数,空格分隔参数,其长度为argc.数组下标从0开始,argv[argc]=NULL.
argv[0] 指向程序运行时的全路径名
argv[1] 指向程序在DOS命令中执行程序名后的第一个字符串
argv[2] 指向执行程序名后的第二个字符串
argv[argc] 为NULL.
二.介绍
第一个参数 argc ,用于存放命令行参数的个数。
第二个参数 argv,是个字符指针的数组,每个元素都是一个字符指针,指向一个字符串,即命令行中的每一个参数。
第三个参数 envp ,也是一个字符指针的数组,这个数组的每一个元素是指向一个环境变量的字符指针。
example.c
int main(int argc,char *argv[],char *envp[]) { int i = 0; for (i = 0; i < argc; i++) { printf("%s ", argv[i]); } system("pause"); return 0; }
我们在Windows系统下运行一下,打开cmd,找到刚才我们所写的example.c,输入参数,回车看结果
这个argc数组中总共有4个参数,下图解释:
接下来,我们看一个例题:
题目:使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
1 int Add(int x, int y) 2 { 3 return x + y; 4 } 5 int Sub(int x, int y) 6 { 7 return x - y; 8 } 9 int Mul(int x, int y) 10 { 11 return x * y; 12 } 13 int Div(int x, int y) 14 { 15 return x / y; 16 } 17 int main(int argc,char *argv[],char *envp[]) 18 { 19 int x = 0; 20 int y = 0; 21 int ret = 0; 22 if (argc != 4) 23 { 24 printf("请检查参数个数"); 25 return 0; 26 } 27 //判断-a -s -m -d中的哪一种 28 x = atoi(argv[2]); 29 y = atoi(argv[3]); 30 switch (*(argv[1] + 1)) 31 { 32 case 'a': 33 //Add(*(argv[2]),*(argv[3]));错误,因为char* 类型 34 //atoi()函数 把字符串转换成整数 解决方案ex7右击属性 命令参数里加入-a 123 321 35 ret = Add(x, y); 36 break; 37 case 's': 38 ret = Sub(x, y); 39 break; 40 case 'm': 41 ret = Mul(x, y); 42 break; 43 case 'd': 44 ret = Div(x, y); 45 break; 46 default: 47 printf("参数有误 "); 48 break; 49 } 50 printf("%d ", ret); 51 system("pause"); 52 return 0; 53 }
结果如下:
argv数组中最后一个参数NULL,作为这个数组的结束标志。
argc表示的是argv这个数组不为空的元素个数。
最后来解释一下最后一个参数envp,存放环境变量的数组。
1 int main(int argc, char *argv[], char *envp[]) 2 { 3 int i = 0; 4 while (envp[i] != NULL)//数组最后一个元素是NULL 5 { 6 printf("%s ", envp[i]); 7 i++; 8 } 9 system("pause"); 10 return 0; 11 }
envp数组的最后一个元素也时NULL指针。
打印出数组中的环境变量,如图:
截取部分:
每一行都是一个环境变量。