getopt解析

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的第一个字符:
    • 如果是: 返回冒号,否则返回?

需要注意的点

  1. 如要被解析,所有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的下标。

返回值

  1. 如果识别短选项,同getopt一样返回短选项字符
  2. 如果是识别长选项,由参数longopts中struct option.flag与struct option.val共同决定,具体参见上面参数的说明
  3. 选项参数解析完成后,返回-1
  4. 如果遇到存在歧义或未知的选项,则返回 ?

三、getopt_long_only()

getopt_long_only()的用法和上面的getopt_long()完全一样,唯一的区别在输入长选项的时候可以不用输入--而使用-

posted @ 2022-07-05 17:12  INnoVation-V2  阅读(101)  评论(0)    收藏  举报