getopt解析
主要由以下三个函数组成
getopt()
getopt_long()
getopt_long_only()
optarg——指向当前选项参数(如果有)的指针。
optind——再次调用 getopt() 时的下一个 argv 指针的索引。
optopt——最后一个未知选项。
功能
对参数进行解析
一、getopt()
1.函数定义
int getopt(int argc, char * const argv[], const char *optstring);
2.参数说明
-
argc: argv中参数个数
-
argv: 存储传递而来的参数
-
optstring: 解析格式
argv第一个参数是当前执行的文件名,所以argc最小为1
例如执行 ./test -p 2000
那么argc = 3 argv[0] = "./test" argv[1] = "-p" argv[2] = "2000"
因此若要手动定义argc和argv向getopt()传递,需注意第0个元素不会被解析
3.optstring规则说明
-
字母后接冒号: ,表示选项后面必须带有参数
-
字母后跟双冒号 :: ,表示参数可选
4. 返回值
- 成功匹配argv,则返回argv中字符。
- 遇到未知选项,返回?
- 所有命令行选项已被解析,返回-1
- 遇到选项缺少参数,返回值取决于optstring的第一个字符:
- 如果是: 返回冒号,否则返回?
需要注意的点
- 如要被解析,所有argv参数必须以-开头,-a, -b等
二、getopt_long()
和getopt()功能完全一致,只是支持了长选项,长选项需要使用struct option定义
int getopt_long(int argc, char * const argv[],
const char *optstring,
const struct option *longopts, int *longindex);
1.struct option
struct option
{
const char *name; //表示的是长选项名
int has_arg;
// has_arg有3个值,no_argument(或者是0)
// required_argument(或者是1)
// optional_argument(或者是2)
int *flag;
// 决定getopt_long()的返回值
// 如果flag是null(通常情况),则函数会返回val值
// 如果flag不是NULL,将val值赋值给flag所指内存,并将返回值设置为0
int val;
};
注
1)数组的最后一个元素必须填充为0。 (2)has_arg取值为required_argument(或者是1)时,参数输入格式为:
--选项 值 或者 --参数=值
复制
optional_argument(或者是2)时,参数输入格式只能为:
--选项=值。
复制
(1)数组的最后一个元素必须填充为0。
(2)has_arg取值为required_argument(或者是1)时,参数输入格式为:
--选项 值 或者 --参数=值
optional_argument(或者是2)时,参数输入格式只能为:
--选项=值
长选项名是可以使用缩写方式,比如
struct option long_options[] =
{
{"help",no_argument,NULL,'h'},
{"file", required_argument,NULL,'f'},
{"output",optional_argument,NULL,'o'}
{0, 0, 0, 0}
}
可以输入--f、--fi、--fil,均会被正确识别为–file选项。
(3) longindex:如果longindex不是NULL,它指向getopt_long()获得的长选项在longopts的下标。
返回值
- 如果识别短选项,同getopt一样返回短选项字符
- 如果是识别长选项,由参数longopts中struct option.flag与struct option.val共同决定,具体参见上面参数的说明
- 选项参数解析完成后,返回-1
- 如果遇到存在歧义或未知的选项,则返回 ?
三、getopt_long_only()
getopt_long_only()的用法和上面的getopt_long()完全一样,唯一的区别在输入长选项的时候可以不用输入--
而使用-
。