命令选项参数解析
我们都是知道程序在启动时是可以接收命令参数的。通过main(int argc,char **argv)函数的argc和argv来传入命令参数。这时我们需要解析。当然glibc库中包含了相关函数来方便我们解析命令参数。
为了表述方便,我们用命令gcc -o exefile test.c来举例说明。其中gcc是运行命令(可执行文件),-o exefile test.c是它的参数。各个参数之间使用空格分开。main()函数的argc表明了输入参数的个数。此例的argc=4(gcc本身也算一个参数)。argv为一个字符串指针数组。存放这所有输入参数的指针。如argv[0]指向gcc,argv[1]指向-o,argv[2]指向exefile等等。
除此之外,输入参数中有些术语需要了解。如下
短选项:如上面的-o就是短选项。它由-开头,后面只能跟一个字符。短选项又具体分为:
必须带参数的短选项:指它后面必须要有一个参数。如-o exefile,exefile就是它的参数。
可选带参的短选项:指它后面可以带或不带参数。
不带参的短选项:指它后面不带参数。
长选项:如--version就是长选项。它由--开头,后面可跟多个字符。它也分必须带参,可选带参,不带参。
无选项参数:它前面不需要有短选项或长选项。如上面的test.c参数。
glibc库中提供了支持解析短选项的getopt()函数和长选项的getopt_long()函数。看下面的介绍和使用例程。
解析程序输入参数相关函数介绍
下面函数都需要包括getopt.h文件。
int getopt(int argc, char *const argv[],const char *optstring)
描述:解析命令行参数。调用getopt()函数解析完argv数组后,会对其排序。将其无选项参数放在最后。如果不想让其排序,定义环境变量_POSIX_OPTION_ORDER即可。
argc,argv:和main函数的这两个参数一样。第一个代表参数个数。第二个是选项数组。
optstring:指定选项格式。具体格式如下(a代表某个选项)
a:表示此选项没有参数,如-a。如果跟了参数会报错。如-a lkd这种格式错误。
a::表示此选项有参数,如-a lkd。以可连写为-alkd。如果不跟参数会报错。
a::表示此选项的参数可选。当有时必须用连写方式-alkd。此种格式是GNU扩展的。
eg:optstring = "a:bc::"表示a选项必须要有参数,b选项无参数,c选项可有可无。所以输入参数的格式应为./test -a lkd -b -cname.
return:如果选项成功找到,返回选项字母;当没有更多的选项参数可用时,它返回-1.
注意:对其无选项参数,可以在getopt()将选项参数解析完之后(此时会参数默认会自动排序,将其无选项参数放在了最后),直接使用optind跟argc对比打印。