• getopt解析 INnoVation


    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()完全一样,唯一的区别在输入长选项的时候可以不用输入--而使用-

  • 相关阅读:
    经典算法以及案例总结
    supervisor的介绍
    快速排序算法
    mysql 省市联动sql 语句
    前段验证框架 formValidator
    css 之!important
    js 倒计时
    js 设置url 参数值
    java 获取指定日期
    js 日期控件laydate使用
  • 原文地址:https://www.cnblogs.com/INnoVationv2/p/16447210.html
Copyright © 2020-2023  润新知