看完你就明白:什么情况下该用int main(int argc, char *argv[])而不是int main(void)
微信公众号:"C语言初学者之家"
之前的文章中提到,C语言main函数可以写作int main(void),也可以写成int main(int argc, char *argv[]) 。
到底哪种main函数写法对?main()、int main(int argc, const char * argv [])...
文章的最后,我们说:一般情况下,你编程用int main(void)就可以了。那你可能会问:一般情况指哪些情况?什么情况下要用int main(int argc, char *argv[]) ?
这篇文章给你解答。
1.什么情况下用int main(int argc, char *argv[]) 。
我们需要和程序进行交互。你知道,在程序运行过程中,可以通过scanf函数,输入数组、字符、字符串给程序处理。
那么能不能在程序启动的时候(),就携带参数给他,而不是运行过程中敲入东西给程序。这时候需要用用到带参数(int argc, char *argv[])的main函数。
你很可能用过ping命令,去ping一个IP地址,比如:ping 192.168.0.1
其实这个里的ping就是一个exe程序,"192.168.0.1"是一个字符串,是我们传递给程序的参数。
所以,当你需要程序带参数地启动的时候,就用int main(int argc, char *argv[])。
2.怎么使用argc和argv参数。
你可能会想,argc和argv是传给main函数的参数。那这个参数是谁传的?main函数不是已经是入口函数了吗?还有别的函数调用main函数?
argc和argv是你通过命令行窗口传给程序的。
你先猜猜下面的程序运行结果是什么?
#include <stdio.h>
int main(int argc , char *argv[])
{printf("argc = %d\n", argc);printf("%s\n", *argv);
}
我们编译运行,结果如下。有没有发现,*argv是字符串,字符串的内容是exe程序文件名(包括它的完整路径)。
argc = 1,这个表示什么?表示的是命令行有1个字符串,这个字符串是"D\test\main_arg_argv.exe",也就是我们的程序名。
你可能会想:
(1)那怎么通过命令行给程序传递字符串呢?
(2)程序是怎么样获取到传递来的字符串呢?
答案是:
(1)用这样的格式给程序传递字符串:
程序名.exe 字符串1 字符串2 字符串3 ... 字符串n
执行exe程序时,你可以在.exe名字后面加上任意多个字符串。每个字符串用空格隔开。
(2)在main函数里通过循环依次一个个地来接收字符串。
举个例子:
我们来做这样一个程序:
要求:
传递的某个字符串等于"Aa"就打印"A for apple",传递的某个字符串里等于"Bb"就输出"B for ball",传递的某个字符串等于"Cc"就输出"C for ball",传递的某个字符串等于"Dd"就输出"D for dog".
先上代码:
#include <stdio.h>
#include <string.h>int main(int argc , int *argv[])
{printf("argc = %d\n", argc);argv++;while (*argv){if (strcmp(*argv, "Aa") == 0){argv++;printf("A for apple\n");}else if (strcmp(*argv, "Bb") == 0){argv++;printf("B for ball\n");}else if (strcmp(*argv, "Cc") == 0){argv++;printf("C for cat\n");}else if (strcmp(*argv, "Dd") == 0){printf("in d\n");argv++;printf("D for dog\n");}}
}
注意这个时候,我们就不能直接在编辑器里直接运行程序,因为这样自动运行是没有参数的。
点下图中的编译按钮。然后进入源文件所在文件夹:D:\test。可以看到生成了一个文件名叫main_argc_argv.exe,这个就是编译生成的可执行文件,俗称“程序/软件”。
D:\test\main_argc_argv.exe
那么怎么运行呢?
打开命令行,鼠标左键选中.exe文件,拖到cmd窗口中:
然后在后面加上我们想要加的字符串。这里加上"Cc"和"Aa"
然后,按回车键运行。
如我们所期望的,命令行我们敲参数时,Cc在Aa前面,所以先打印出"C for cat",后打出"A for apple"。
注意:这里的argc是3,表示的是什么呢?
之前我们说过,arrgc=1时,表示命令行只有一个字符串,是程序名"D\test\main_arg_argv.exe"。
3表示命令行有3个字符串,分别是:程序名"D\test\main_arg_argv.exe"、"Cc"和"Aa"。
这下你应该明白怎么使用main函数中的参数了。
3.总结
当你需要程序带参数地启动的时候,就用int main(int argc, char *argv[])。
扫描二维码 关注微信公众号"C语言初学者之家"
看完你就明白:什么情况下该用int main(int argc, char *argv[])而不是int main(void)相关推荐
- 硬件:笔记本电脑7大分类总结,看完你就明白了!
今天给大家分享笔记本电脑7大场景分类,看完你就明白了! 游戏本 游戏本最早由外星人和微星推出,在90年代就引起了众多游戏玩家的热捧.目前游戏本在笔记本电脑市场可谓是超级火爆,基本每个大厂商都推出了专门 ...
- 你的Scrum迭代够精益吗?看完就全明白了
你的Scrum迭代够精益吗?看完就全明白了 原文 http://www.jackyshen.com/2017/08/02/is-your-Scrum-lean-enough/ Scrum与产品创新 V ...
- 游戏伤害计算机,阴阳师:输出和防御之间的各种计算,看完就能明白游戏的伤害机制...
原标题:阴阳师:输出和防御之间的各种计算,看完就能明白游戏的伤害机制 小伙伴们大家好,今天小编给大家科普一下游戏输出和防御之间的各种计算公式吧,相信在清楚伤害计算之后大家对各种属性的搭配也会有更好的理 ...
- MySQL索引-B+树(看完你就明白了)
索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据. 索引最形象的比喻就是图书的目录了.注意这里的大量,数据量大了索引才显得有意义,如果我想要在 [1,2,3,4] 中找到 4 ...
- 计算机显示器的三原色是,显示器参数看不懂?看完你就明白啦!
原标题:显示器参数看不懂?看完你就明白啦! 对于电脑性能最直观的感受,就是通过显示器来感受.现在的各种显示器选择很多,各种参数也很多,无论是游戏.绘图.影视还是普通的商务用显示器都有不同的需求,因此选 ...
- 怎样发量暴增_发量少怎么办如何增加发量?看完你就明白了
发量少怎么办如何增加发量?看完你就明白了 随着社会压力的增大,很多疾病都跻身于医学界,脱发就是最常见的疾病之一,尤其是脂溢性脱发!之前我们讲到过,脂溢性脱发从中医角度来看主要是分为临泣穴脱发和百会穴脱 ...
- 虹科分享 | 简单实用的CANopen介绍,看完你就明白了(2)——CANopen框架与七种服务类型
目前,CANopen通讯协议已经在工业领域得到了广泛的使用,由于其面向对象的设计思路,CANopen协议已成为欧洲等国家的自动化公司标配的通讯接口之一.在本系列文章中,我们将介绍CANopen协议的基 ...
- 计算机专业对应的职业,这十个高薪职业对应哪些大学专业?看完你就明白啦
原标题:这十个高薪职业对应哪些大学专业?看完你就明白啦 每年高考结束后,报考大学填报专业渐渐成为广大考生和家长最头疼的事情,报考大学还好说一些,毕竟每一位高三考生心中都根据自己的实际情况,曾经设想过几 ...
- 清华计算机2017学硕,2017级清华大学研究生来自于哪些大学?看完你就明白啦!...
原标题:2017级清华大学研究生来自于哪些大学?看完你就明白啦! 清华大学,作为我国高校中的顶尖学府,是很多学生心中的梦想之地,每年的高考中,只有各省的前几十名才有机会被清华大学录取.但是研究生,作为 ...
最新文章
- 天池算法赛:数据挖掘经典赛事!DCIC 2020 数字中国创新大赛启动!
- MySQL数据库中的事务(四大特性)
- 剑指Offer系列 重建二叉树
- 单片机向左,嵌入式向右
- 字节流和字符流复制文件内容实例
- python3 爬虫4--解析链接
- mysql如何定位到数据_如何快速定位当前数据库消耗CPU最高的sql语句?
- kibana 查询_Exceptionless服务端+kibana部署实时日志纪要
- ubuntu双系统时间同步_解决Ubuntu 16.04.6 + Win10 双系统时间错误且不一致问题
- python一个函数可以有参数也可以没有参数_Python:有和没有关键字参数的lambda函数行为?...
- MFC 小知识总结五
- detr 历史解析代码_视觉/ DETR变压器
- Python 爬取zw年鉴
- Linux服务器中查询IP地址五个方法
- html+dfn标签,HTML DOM DFN用法及代码示例
- TencentOS 3.1安装MySQL 8.0.32
- android11obb,exagear安卓11数据包obb
- CTF网络安全大赛介绍
- 服务器配置和部署(待完善)
- XSL中特殊符号详解
热门文章
- 小师弟肝了七天七夜,东半球最全「后台开发」学习路线出炉
- mysql之 1044 - Access denied for user ‘justcall‘@‘%‘ to database ‘mysql‘
- Sharding-JDBC 之公共表
- 如何确定K-means算法中的k值?
- android sharesdk 使用教程,Android中使用ShareSDK学习
- Srvctl命令详细
- linux SIGSEGV信号
- ibm bpm开发 手册_使用定制的IBM BPM数据处理程序简化管理复杂输入数据的方式
- IT领域什么创业项目有前途
- 十大哲理故事(zt)