C语言 深度探究C语言中的命令行环境
admin
2024-04-14 07:05:22
0

命令行环境


命令行参数

C 语言程序可以从命令行接收参数

$ ./foo hello world

上面示例中,程序foo接收了两个命令行参数helloworld

程序内部怎么拿到命令行参数呢?C 语言会把命令行输入的内容,放在一个数组里面

main()函数的参数可以接收到这个数组

#include int main(int argc, char* argv[]) {for (int i = 0; i < argc; i++) {printf("arg %d: %s\n", i, argv[i]);}
}

上面示例中,main()函数有两个参数argc(argument count)和argv(argument variable)

这两个参数的名字可以任意取,但是一般来说,约定俗成就是使用这两个词

第一个参数argc是命令行参数的数量,由于程序名也被计算在内,所以严格地说argc是参数数量 + 1

第二个参数argv是一个数组,保存了所有的命令行输入,它的每个成员是一个字符串指针

./foo hello world为例,argc是3,表示命令行输入有三个组成部分:./foohelloworld

数组argv用来获取这些输入,argv[0]是程序名./fooargv[1]helloargv[2]world

一般来说,argv[1]argv[argc - 1]依次是命令行的所有参数

argv[argc]则是一个空指针 NULL

由于字符串指针可以看成是字符数组,所以下面三种写法是等价的

// 写法一
int main(int argc, char* argv[])// 写法二
int main(int argc, char** argv)// 写法三
int main(int argc, char argv[][])

另一方面,每个命令行参数既可以写成数组形式argv[i],也可以写成指针形式*(argv + i)

利用argc,可以限定函数只能有多少个参数

#include int main(int argc, char** argv) {if (argc != 3) {printf("usage: mult x y\n");return 1;}printf("%d\n", atoi(argv[1]) * atoi(argv[2]));return 0;
}

上面示例中,argc不等于3就会报错,这样就限定了程序必须有两个参数,才能运行

另外,argv数组的最后一个成员是 NULL 指针(argv[argc] == NULL

所以,参数的遍历也可以写成下面这样

for (char** p = argv; *p != NULL; p++) {printf("arg: %s\n", *p);
}

上面示例中,指针p依次移动,指向argv的每个成员,一旦移到空指针 NULL,就表示遍历结束

由于argv的地址是固定的,不能执行自增运算(argv++),所以必须通过一个中间变量p,完成遍历操作


退出状态

C 语言规定,如果main()函数没有return语句,那么结束运行的时候,默认会添加一句return 0,即返回整数0

这就是为什么main()语句通常约定返回一个整数值,并且返回整数0表示程序运行成功

如果返回非零值,就表示程序运行出了问题

Bash 的环境变量$?可以用来读取上一个命令的返回值,从而知道是否运行成功

$ ./foo hello world
$ echo $?
0

上面示例中,echo $?用来打印环境变量$?的值,该值为0,就表示上一条命令运行成功,否则就是运行失败

注意,只有main()会默认添加return 0,其他函数都没有这个机制


环境变量

C 语言提供了getenv()函数(原型在stdlib.h)用来读取命令行环境变量

#include 
#include int main(void) {char* val = getenv("HOME");if (val == NULL) {printf("Cannot find the HOME environment variable\n");return 1;}printf("Value: %s\n", val);return 0;
}

上面示例中,getenv("HOME")用来获取命令行的环境变量$HOME,如果这个变量为空(NULL),则程序报错返回

相关内容

热门资讯

鼠星星的男朋友是谁 鼠星星的男朋友是谁喵喵学长。小红书上鼠星星的男朋友是喵喵学长,娜娜子的男朋友是小豹子。《鼠星星》是一...
杭州吉祥物是什么 杭州吉祥物是什么杭州吉祥物是宸宸、琮琮、莲莲。杭州亚运会吉祥物“三小只”代表的是杭州的三大世界文化遗...
英语高手请进 英语高手请进利用“DINOSAUR”“DIOGENES”“DISNEYLAND”三个单词写一篇英语故...
很多电影都有这种两根麦田括号,... 很多电影都有这种两根麦田括号,我想知道是什么含义?如图!!!表示它在某电影节上获奖了如你给的图为在威...
高中生抑郁症 高中生抑郁症两年前出现所描述症状,未医自愈,近来几月复发,这两星期特严重,相关休学证明如何开有时间可...
一个车加个乐字念什么 一个车加个乐字念什么如题如题谢谢,车,乐。
勇于任事是什么意思 勇于任事是什么意思勇于任事者 很多时候明知不可为而为 有相当的棱角 善于任事者 则凡事趋利避害见风使...
求几本主角穿越到二次元的完结小... 求几本主角穿越到二次元的完结小说,最好是那种穿越去了又穿越回来的。有资源就更好了……月宿 网王...
金庸小说里的所有武功秘籍? 金庸小说里的所有武功秘籍?九阳真经 九阴真经 蜀道难牌法 雷动於九天之上剑法 一阳指 五罗轻烟掌 六...
《荆棘王座》是悲剧还是喜剧啊? 《荆棘王座》是悲剧还是喜剧啊?我问的是最终结局耶应该是喜剧把或者是悲喜参杂。。。
契阔是什么意思? 契阔是什么意思?死生契阔,与子成说是什么?无论生死,永不分离,是我们早以订下的誓言。我要牵着你的手,...
有多少物种因人为因素灭绝? 有多少物种因人为因素灭绝?例:亚洲狮(1908),渡渡鸟(???),旅鸽(1930),猛犸象(???...
你的世界不再有我,我的世界不再... 你的世界不再有我,我的世界不再有你。我不能再珍惜你,抱歉,我失去的,也是你失去的分手后,我还认识你,...
解锁溪水冰镇荔枝吃法!肇庆鼎湖... 7月12日,肇庆鼎湖山景区的飞水潭瀑布从30米高的悬崖飞泻而下,激起阵阵清凉水雾。景区特别设置了互动...
在工作中犯错了怎么办 在工作中犯错了怎么办在工作中犯错,在所难免,不过你不能重复犯错,这样就不正常了,要学会避免犯错误,举...
酒吗水吗喝吗醉吗下联是 酒吗水吗喝吗醉吗下联是酒吗水吗喝吗醉吗下亮梁凯联敬唤是钱嘛渣含纸嘛花嘛赚嘛。酒吗水吗指酒就是水做的,...
老保姆教我蒸鸡蛋,蒸出来和豆腐... 厨房灶台边,老保姆李姨微微俯身,眼睛眯成温柔的两道细缝。她手中的瓷碗倾斜下来,清澈的温水一点点注入金...
仙剑四中玄霄头上红色的那道有什... 仙剑四中玄霄头上红色的那道有什么含义?打扮用的 让霄哥更cool玄霄的印记与重楼的火纹印完全不同!玄...
三国演义为什么要美化诸葛亮 三国演义为什么要美化诸葛亮是在三国演义问世之前,有关三国的故事就已经流传很广,各种传说故事,说书人共...
寻找如《火爆妖夫》这一类的完结... 寻找如《火爆妖夫》这一类的完结小说《云狂》吧!风行烈写的真的都很好看。诱君欢盗情兽妃诱奴娇