getopt被用来解析命令行选项参数。
#include <unistd.h>
char *optarg;
int optind,
int opterr,
int optopt;
getopt(int argc, char * const argv[], const char *optstring);
首先说一下什么是选项,什么是参数。
1.单个字符,表示选项,
2.单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。
3 单个字符后跟两个冒号,表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(这个特性是GNU的扩张)。
例如gcc -g -o test test.c ,其中g和o表示选项,test为选项o的参数。
上面是getopt()函数的基本含义,大家懂得了这些之后,我们一个例子加深一下理解。
例如我们这样调用getopt(argc, argv, "ab:c:de::");
从上面我们可以知道,选项a,d没有参数,选项b,c有一个参数,选项e有有一个参数且必须紧跟在选项后不能以空格隔开。getopt首先扫描argv[1]到argv[argc-1],并将选项及参数依次放到argv数组的最左边,非选项参数依次放到argv的最后边。
代码如下:
#include <unistd.h>
#include <stdio.h>
int main(int argc, char * argv[])
{
printf("optind:%d,opterr:%dn",optind,opterr);
printf("————————–n");
%d,argc:%d,argv[%d]:%sn", optind,argc,optind,argv[optind]);
(ch) {
‘a’:
option: -ann");
‘b’:
option: -bn");
argument of -b is %snn", optarg);
‘c’:
option: -cn");
argument of -c is %snn", optarg);
option: -dn");
option: -en");
argument of -e is %snn", optarg);
‘?’:
option: %cn",(char)optopt);
}
执行结果:
shiqi@wjl-desktop:~/code$ vim getopt.c
shiqi@wjl-desktop:~/code$ gcc getopt.c -o g
shiqi@wjl-desktop:~/code$ ./g file1 -a
optind:1,opterr:1
————————–
optind: 3,argc:10,argv[3]:-b
HAVE option: -a
optind: 5,argc:10,argv[5]:code
HAVE option: -b
The argument of -b is -c
optind: 7,argc:10,argv[7]:file2
HAVE option: -d
optind: 9,argc:10,argv[9]:file3
HAVE option: -e
The argument of -e is (null)
—————————-
optind=6,argv[6]=file1