本文共 3286 字,大约阅读时间需要 10 分钟。
我们平时使用main函数时,在main函数参数这一栏常常省略不写,或者填上(void)。实际上main函数是具有参数的,并且它的参数有很大作用。今天我们来看看main函数的参数。
int main () { return 0; }
在我们写好一个main函数框架后按F10开始单步调试,一直调试到走出main函数大括号外。这时我们能够看到如下代码:
int main (int argc, char *argv[], char *envp[]) { return 0; }
要搞懂这几个参数的实际意义,我们需要在VS编译器下,右击工程名,选择属性选项,在配置属性栏下选择子选项:<调试> , 在右边栏命令参数一栏添加一些字符,并以空格将它们一一隔开。
(例如添加 :呵呵 哈哈 嘻嘻 嘿嘿)int main(int argc, char *argv[], char *envp[]) { int i = 0; for (i = 0; i < argc; i++) { printf("%s\n", argv[i]); } return 0; }
ls -l//这是列出当前目录下所有文件的详细参数
这里的 ls 以及 -l 就是我们所说的命令行参数。
我们刚才在给调试右边栏命令参数栏中填写的以空格隔开的字符就是在给参数命名,后面我们会讲它的具体用法。 那么由此我们可以分析出,我们在刚才main函数那个for循环中控制终止条件的argc就是我们的命令参数的个数。 而在printf("%s\n", argv[i])中argv[]这个数组,通过main函数的定义我们知道它是一个存放char* 类型的指针数组。那么这里它应该就是存放的我们刚才输入的四个字符串的首地址。事实上argv[]中最后一个元素恒存放一个空指针,作为argv数组的结束标志
我们在windows命令行指令中(cmd)也能添加类似的命令行参数。按下电脑的win + R键调出运行窗口,在输入栏输入cmd然后回车,出现黑色窗口,这就是我们的终端窗口:
大家见识了main函数的前两个参数后,一定会有一个疑问,那就是命令行的参数到底怎么用?其实,在我们日常生活中常出现的计算器,就可以用main函数参数来简单实现。那么下面我就用main函数前两个参数来实现一下计算器这个小程序:
假设我们想进行加法运算,那么肯定需要让电脑知道我们要进行加法运算,所以"add"这个命令参数必不可少,然后还有参与加法的两个操作数,只要有了这几个参数,我们就可以让电脑进行运算了。那么前提条件我们已经准备好了,下面我给大家来分步讲解一下实现方法。 我们知道刚刚在main函数中写出的小程序的作用是输出argv[]数组中的各个元素,那么我们就可以得知,argc是记录我们刚才输出参数的个数的(因为argc在控制for循环的循环次数)。我们输入的那些参数全部被存放在argv[]这个数组当中,如果我们在输入参数后在读取argv[]数组是否可以做一个简单的计算器呢? 这里我简单实现一个加法的小运算指令:enum calc{ ADD = 'a', SUB = 's', MUL = 'm', DIV = 'd'};int Add(int a, int b){ return a + b;}int Sub(int a, int b){ return a + b;}int Div(int a, int b){ return a / b;}int Mul(int a, int b){ return a * b;}int main(int argc, char *argv[], char *envp[]){ if(argc != 4) { prinf("usage : .exe sum1 [a | s | m | d] sum2\n"); return -1; } int a = atoi(argv[1]); int b = atoi(argv[3]); int ret = 0; //switch (*(argv[1] + 1)) switch( argv[2] ) { case ADD: ret = Add(a, b); break; case SUB: ret = Sub(a, b); break; case MUL: ret = Mul(a, b); break; case DIV: ret = Div(a, b); break; default: printf("参数有问题\n"); return -1; } printf("%d\n", ret); return 0;}
这里我的思路是先判断argc的大小也就是用户输入参数个数是否是规定的大小。
再将用户输入的第2,3个参数进行字符到数字的转换。 最后我们使用switch判断语句判断用户想要进行的操作指令,这里我的事件标签使用枚举的方法是代码更具可读性。枚举类型的定义在最上面。看到这,我们是不是对main函数的参数有了一定的了解。
##envp[]环境参数 最后我们简单介绍一下第三个参数,envp[],这个数组与刚才的**argv[]**有些相似,它的最后一个元素也储存的空指针。接下来大家将envp[]数组中的元素打印出来:int main(int argc, char *argv[], char *envp[]){ int i = 0; while (envp[i] != NULL) { printf("%s\n", envp[i]); i++; } return 0;}