getopt
函数参数
函数原型为:
int getopt(int argc, char * const argv[], const char *optstring);
涉及的全局变量:
extern char *optarg;
extern int optind, opterr, optopt;
包含的头文件:
#include <unistd.h>
先说几个概念:
- 选项:指的是命令行参数中的-
符号后面的字母,比如-a中a就是选项。
- 选项参数,指的是选项后面跟的值,有的选项后面必须有个值,有的选项后面没有值,有的选项后面可能有值。
getopt的函数声明中,argc为命令行参数的个数,argv[]为命令行参数列表,optstring为可能出现的选项的列表。
optstring:如果一个选项后面带有:,则该选项必须带选项参数。如果一个选项后面带有::,则该选项后面可能带参数。
如果一个选项后面可能带参数,那么在命令行中,该选项的参数跟该选项之间不能有空格,如果一个选项后面必须带参数,那么选项和它的参数之间可以有空格。
举个例子,比如现在的optarg为abc:d::,那么a和b后面没有参数,c后面必须有参数,d后面可能有参数。我们的命令行参数就可以是
command -a -b -c cvalue -ddvalue
注意,d和dvalue之间没有空格。
全局变量
- optarg: 指向当前选项的选项参数(如果有的话)
- optind: 下一个选项的索引。getopt函数会重排命令行参数,所以选项都在argv数组的前面,当argv数组处理完毕后,如果optind >= argc, 就说明出现了过多的选项。
- opterr: 将opterr设为0,getopt将不打印错误信息。
- optopt: 当getopt遇到一个未知的选项,或一个选项缺少要求的参数,optopt存储该选项。
- 返回值:函数的返回值为当前处理的选项,,如果getopt在optstring中找不到该选项或是缺少选项参数,getopt返回’?’,并且打印错误信息。如果optstring的第一个字母是’:’, 那么当缺少选项参数时,getopt返回’:’而不是’?’。如果不再有可识别的选项,getopt返回-1。
getopt_long
getopt_long函数可以处理长选项,就像–help这种,选项长度大于1个字母,需要以–开头。
函数声明:
#include <getopt.h>
int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
前三个参数和getopt一样,第四个参数longopts指向option结构体数组,struct option定义如下:
struct option{
const char *name;
int has_arg;
int *flag;
int val;
};
- const char *name: 选项的名字
- int has_arg:选项是否有参数。它的值为以下三种
符号常量 | 数值 | 含义 |
---|---|---|
no_argument | 0 | 选项没有参数 |
required_argument | 1 | 选项需要参数 |
optional_argument | 2 | 选项参数可选 |
- int *flag 和 int val: 如果flag为NULL, 那么getopt_long
返回本结构中val的值;如果flag不为NULL,那么将flag指向的变量设为val的值,getopt_long
返回0.通过flag和val,我们就可以在处理命令行参数的同时自动设置标记变量。
参考文章:
http://www.cnblogs.com/oloroso/p/4616282.html
http://www.cppblog.com/flyonok/archive/2010/09/04/125884.aspx
https://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html