
【浅谈】main函数的三个参数
我们可以很清晰的看到main函数时有参数的,而且是三个参数,并且在main函数被调用时是有这三个参数被传入的,但是我们日常并没有使用过。 下面我将三个参数的定义写出:
我们回到main函数代码块,写下如下代码并调试运行看看结果:
紧接着在黑框中输入存放调试文件目录的那个磁盘的卷名。 再使用cd命令将当前的路径转到存放我们当前调试的文件的DEBUG文件目录下,再使用dir命令列出当前目录下的文件(与Linux中ls命令相似):
我们再输入**.exe**后缀的文件名后面加上一些字符,按回车运行之(即在cmd下执行刚才的调试程序,最终效果与刚才的程序效果相同):
小伙伴们有没有发现,这和在编译器下运行的情况很相似,唯一的不同是我们在cmd窗口手动添加了几个字符。 那么我们不妨展开联想,是否可以将这个特性运用到实际中去…
发布日期:2021-05-07 00:50:45
浏览次数:7
分类:技术文章
本文共 3286 字,大约阅读时间需要 10 分钟。
【浅谈】main函数的参数
我们平时使用main函数时,在main函数参数这一栏常常省略不写,或者填上(void)。实际上main函数是具有参数的,并且它的参数有很大作用。今天我们来看看main函数的参数。
main函数的参数有哪些?
int main () { return 0; }
- 1
- 2
- 3
- 4
在我们写好一个main函数框架后按F10开始单步调试,一直调试到走出main函数大括号外。这时我们能够看到如下代码:
int main (int argc, char *argv[], char *envp[]) { return 0; }
- 1
- 2
- 3
- 4
要搞懂这几个参数的实际意义,我们需要在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; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
ls -l//这是列出当前目录下所有文件的详细参数
- 1
这里的 ls 以及 -l 就是我们所说的命令行参数。
我们刚才在给调试右边栏命令参数栏中填写的以空格隔开的字符就是在给参数命名,后面我们会讲它的具体用法。 那么由此我们可以分析出,我们在刚才main函数那个for循环中控制终止条件的argc就是我们的命令参数的个数。 而在printf("%s\n", argv[i])中argv[]这个数组,通过main函数的定义我们知道它是一个存放char* 类型的指针数组。那么这里它应该就是存放的我们刚才输入的四个字符串的首地址。事实上argv[]中最后一个元素恒存放一个空指针,作为argv数组的结束标志
我们在windows命令行指令中(cmd)也能添加类似的命令行参数。按下电脑的win + R键调出运行窗口,在输入栏输入cmd然后回车,出现黑色窗口,这就是我们的终端窗口:
main函数参数有什么作用呢?
大家见识了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;}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
这里我的思路是先判断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;}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
全文完,感谢浏览
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年03月24日 00时25分19秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
java有包名的类访问没有包名的类
2019-03-01
整型关键字的散列映射
2019-03-03
多位水仙花数-python(出现运行超时?不妨用减法计算)
2019-03-03
地下迷宫探索(后两个测试点无法通过?这里有你想要的答案)
2019-03-03
小白看完都会了!阿里云大师深入拆解Java虚拟机,看完这一篇你就懂了
2019-03-03
VBA之正则表达式(19)-- 相对引用转绝对引用
2019-03-03
巧用VBA统一数字单位
2019-03-03
Transpose实现数组行列转置的限制
2019-03-03
用float/double作为中转类型的“雷区”
2019-03-03
golang中interface的一些语法缺陷的改进
2019-03-03
vue-router路由 学习笔记
2019-03-03
【数据库】第七章课后题
2019-03-03
第四章 串、数组和广义表 —— BF算法和KMP算法
2019-03-03
[选拔赛1]花园(矩阵快速幂),JM的月亮神树(最短路),保护出题人(斜率优化)
2019-03-03
DLA:一种深度网络特征融合方法
2019-03-03
leetcode114(二叉树展开为链表)
2019-03-03
java —— static 关键字
2019-03-03
在 Python 调试过程中设置不中断的断点 | Linux 中国
2019-03-03
使用开源可视化工具来理解你的 Python 代码 | Linux 中国
2019-03-03
硬核观察 | 有人在比特币骗局中损失了 10 个比特币
2019-03-03