参数分析
在学习C语言函数时我们不难发现几乎所有被调用的函数都具有自己的参数列表,那么作为程序入口的main函数又是否具有参数呢?
Main函数虽然是整个C程序的入口但却不是整个函数调用中的第一个,当程序执行时main函数被main函数被 __tmainCRTStartup调用, __tmainCRTStartup则又被 mainCRTStartup函数调用。在日常的编码过程中我们虽没有在main函数的参数列表内加入任何值,但其确实具有参数。main函数原型如下所示:
int main(int argc,char* argv[],char* envp[])
{
return 0;
}
通过观察原型可以发现main函数具有以下三个参数:
- int argc; // 一个整形的变量;
- char* argv[ ] //一个存放指针的数组;
char* envp[ ] //一个存放指针的数组;
( [ ]的优先级大于 * 的优先级,故变量先是一个数组,其中的内容为char * )了解到参数的类型接下来我们可以将参数的内容先打印出来再对其内容进行讨论:
#include<stdio.h>
int main(int argc,char* argv[],char* envp[])
{
int i = 0;
printf("%d\n",argc);//打印变量argc的值
for(i=0;i<argc;i++)
{
printf("%s\n",argv[i]);//打印argv[]数组的指向内容
}
return 0;
}
程序结果如图1所示:
由此可见argv[ ]数组中存储的第一个字符串内容是当前代码的可执行程序路径,若我们在程序的属性页面中对命令参数进行设置(如图2),加入我是 “Erica_ou” 及“student”两项,程序运行结果如图3所示:
由此可看出argc表示的是命令行参数个数+1(可执行文件路径);而argv[ ]指针数组中的指针指向的字符串是命令行参数内容(如图4所示)。
在对前两个参数有了一定的了解后,现在再看第三个参数char *envp[ ],通过以下代码进行分析:
#include<stdio.h>
int main(int argc,char* argv[],char* envp[])
{
int i = 0;
while(envp[i]!=NULL)
{
printf("%s\n",envp[i]);//打印envp[]数组的指向内容
i++;
}
return 0;
}
程序结果如图5所示:
以输出内容中标注的地方为例,我们可以打开计算机高级系统设置,环境变量中的系统变量对二者进行比对,不难发现envp里存放正是系统的环境变量。
第三个参数envp是用于用来在程序运行时获取系统的环境变量,操作系统运行程序时通过envp 参数将系统环境变量传递给程序。
根据参考:
实例:在main函数中实现计算器
使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
int sum = 0;
int num1 = atoi(argv[2]);
int num2 = atoi(argv[3]);
if (strcmp(argv[1], "-a") == 0)
{
sum = num1 + num2;
}
else if (strcmp(argv[1], "-s") == 0)
{
sum = num1 - num2;
}
else if (strcmp(argv[1], "-m") == 0)
{
sum = num1 * num2;
}
else if (strcmp(argv[1], "-d") == 0)
{
sum = num1 / num2;
}
printf("%d\n", sum);
system("pause");
return 0;
}
相较于前两个参数(argc,argv[ ]),编码时用到envp的机会并不多以及对于这部分相关知识储备有限,所以在此并没有对其做出更深入的理解,仅作为学习总结。凡有不足之处欢迎批评指正,谢谢!