我们一般写代码的时候都会这样写main函数:int main()。所以刚开始我们都以为main函数是没有参数的,然而事实却不是这样子的。首先,我们来看看main函数的原型:
int main(int argc,char* argv[],char* envp[])
所以main函数是有参数的,而且有三个参数。
第一个参数:argc是个整型变量,表示命令行参数的个数(含第一个参数)。
第二个参数:argv是个字符指针数组,每个元素是一个字符指针,指向一个字符串。这些字符串就是命令行中的每一个参数(字符串)。
第三个参数:envp是字符指针数组,数组的每一个原元素是一个指向一个环境变量(字符串)的字符指针。
看下段代码(Linux环境中执行):
#include<stdio.h>
int main(int argc,char *argv[])
{
int i=0;
for(;i<argc;i++)
{
printf("%d->%s\n",i,argv[i]);
}
return 0;
}
看运行结果1:
这个运行结果只有一个,因为我们的命令行中只有一个命令./a.out ,所以argc=1,argv字符指针数组中保存了一个字符串(./a.out )。现在我们用同样的代码,在命令行中多输入几个字符串,运行结果如下:
这个时候argc=6,argv中就有6个元素,所以argv 就像是一个容器一样,将我们命令行中敲击的命令或者选项,按空格为分隔符,一个一个的放在argv中,如下图:
注意
当输入的命令增多时,argv的结构也慢慢增长,我们将argc和argv叫做命令行参数,所以我们在命令行输入的选项是通过argv传入的,argc至少等于1。
#include<stdio.h>
#include<string.h>
int main(int argc,char *argv[])
{
if(argc!=2)//argc是命令行选项的个数,如果参数不等于2就终止程序
{
return 1;
}
if(strcmp(argv[1],"-hello")==0)//通过在命令行输入的第一个选项(即argv[1])的不同来控制输出结果的不同
{
printf("hello world!\n");
}
else
{
printf("hello HL!\n");
}
return 0;
}
上段代码会根据命令行输入的选项的不同,输出的结果也会不同。通过这个代码我们可以看出,一个程序表现出不同的行为是通过它的选项(即命令行的参数)的不同来完成的,而命令行的参数是通过main函数传入的。
注意:argv数组的最后一个元素存放了一个NULL指针。
以上段代码为例:
下面我们再来看看main函数的第三个参数,envp是字符指针数组,数组的每一个原元素是一个指向一个环境变量(字符串)的字符指针。环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
#include<stdio.h>
#include<string.h>
int main(int argc,char *argv[],char* envp[])
{
int i=0;
while(envp[i]!=NULL)//envp数组的最后一个元素也存放了一个NULL指针
{
printf("%d->%s\n",i,envp[i]);
i++;
}
return 0;
}
结果显示的都是环境变量(内容过多,截取部分)
以上就是我总结的main函数参数的相关知识点,不足的地方还望各路大神多多指点~~~