getopt函数
函数介绍
需要引入unistd.h头文件
函数原型
1 | int getopt(int argc,char * const argv[ ],const char * optstring); |
第三个参数是选项字符串
返回值为int类型,我们都知道char类型是可以转换成int类型的,每个字符都有他所对应的整型值,其实这个返回值返回的就是一个选项字符。
还需要知道4个相关概念
extern char* optarg;
extern int optind;
extern int opterr;
extern int optopt;
分析如下:
optarg是用来保存选项的参数的;
optind记录下一个检索位置;
opterr表示是否将错误信息输出到stderr,为0时表示不输出;
optopt表示不在选项字符串optstring中的选项
选项是什么?
比如指令gcc helloworld.c -o helloworld.out;
这条指令中的-o就是命令行的选项,而后面的helloworld.out就是-o选项所携带的参数。当然有些选项是不用带参数的,而这样不带参数的选项可以写在一起。
选项字符串是什么?
比如”a:b:cd::e”,这就是一个选项字符串。
对应到命令行就是-a ,-b ,-c ,-d, -e 。
冒号又是什么呢?
冒号表示参数。
不带冒号就表示这个选项后面的参数是可选的。(带了,也不认携带的参数,不管选项和参数之间是否有空格)
一个冒号就表示这个选项后面必须带有参数(没有带参数会报错哦),但是这个参数可以和选项连在一起写,也可以用空格隔开,比如-a123 和-a 123(中间有空格) 都表示123是-a的参数;
两个冒号的就表示这个选项的参数是可选的,即可以有参数,也可以没有参数,但要注意有参数时,参数与选项之间不能有空格(有空格会不识别携带的参数),这和一个冒号时是有区别的。
示例代码
运行后,看看效果
-a的三种情况
可以看出,不带冒号的话,就不要考虑带参数了。
-b选项
可以看出,带一个冒号的话,必须要带参数,参数可以与选项之间有空格,也可以没空格。
-e选项
可以看出,带两个冒号的话,可以带参数也可以不带参数,但是如果要带参数,参数和选项之间就必须要写在一起(中间不能有空格)。
参考链接
https://www.cnblogs.com/qingergege/p/5914218.html
源码
https://github.com/ThranduilELFKING/toolsUse/blob/main/getOpt/getOpt.cpp
//简单的用法示例