【知识】--命令行参数编程

1. 新程序开始时典型的栈结构

                                            

 2. 命令行参数规范

 1. 短选项参数规范:
1)由选项、选项值、操作数组成 (注意操作数的位置不一定) 例: ① gcc test -o test.out 操作数 选项 选项值 ②./demo abc -f gg de -s 则操作数为 abc、de (2)没有选项值的选项可以合二为一 (注意-abc有时表示的选项是-a,选项值是bc;而不是 -a -b -c 注意要根据规则来看) 例:a.out -a -b -c 等价于a.out -abc (3) 第一次出现的--后面均为操作数 ./demo -s abc -- -f -s 则操作数为 abc、-f、-s
2. 长选项参数规范 (1)长选项是
--指令(后面可以用等号也可以用空格) 短选项是-指令 ./demo.out --name=DYsodg --addr 127.0.0.1 -xabc

3. 命令行参数编程

1. 定义选项规则
     1)短选项规则字符串
          例:hab:c::
            ① 选项后面没有冒号就表示没有参数,例如选项-h、-a
② 选项后面一个冒号,就表示必须要跟参数,例如-b 123 、-b123 ③ 选项后面二个冒号,表示可以跟参数也可以不跟。如果跟的话必须不含空格,例如 -c123、-carg
(2)长选项规则结构体
长选项规则必须要通过结构体struct option来定义,并且option数组的最后一个元素必须全部填充0

            struct option
            {
              const char *name;    //长选项的名称
              int has_arg,         //长选项是否带选项值:1为是,0为否,2为可选;
              int *flag,          //指向用来保存缩写字符的位置,  ① 如果flag为NULL,则getopt_long返回缩写字符val;
                                                             ② 如果flga不为NULL,则getopt_long返回0,flag保存缩写字符val
              int val             //缩写字符 val指明返回的值,或者需要加载到被flag所指示的变量中的值。
           }

2.getopt(……)函数只能解析短选项
(1)int getopt(int argc, char* const argv[],
const char* optstring) //短选项的规则字符串

(2)getopt函数首先对参数进行重新排列
例如: ① 重排前  a.out -f abc 555 -i -s 
重排后  a.out -f abc -i -s 555
② 重排前 a.out -f abc 555 -is 
重排后  a.out -f abc -is 555 

(3)调用getopt函数逐个选项的进行分析与输出,需要配合一下几个已定义好的变量

           extern char *optarg; //指向选项值,注意不是选项!!
           extern int optind,   //表示的是下一个将被getopt()处理到的参数在argv中的下标值
           optopt;              //选项字符,例如 -c 字符为c

       调用一次getopt的结果:
① 选项合法时(即符合短选项规则),返回值为选项字符的ASCII码,optarg指向选项值;
② 选项不合法(短选项规则中没有),返回值为“?”,optopt保存选项字符;
③ 选项合法但缺少选项值, 返回值为“:”,optopt保存选项字符;
④ 所有的选项均解析完, 返回值为-1。


3.getopt_long(……)函数同时解析短选项长选项
  (1)int getopt_long(int argc, char* const argv[],

                      const char* optstring,  //短选项规则字符串
                      const struct option * longopts, //长选项规则结构体数组
                      int *longindex,     //保存当前长选项在 长选项规则数据中数组中 第几个
                      )


   (2)getopt_long函数首先对参数进行重新排列,类似getopt
   (3)调用getopt_long逐个选项的进行分析与输出,需要配合一下几个已定义好的变量(与getopt函数类似)
           extern char *optarg; //指向选项值,注意不是选项!!
           extern int optind,   //表示的是下一个将被getopt()处理到的参数在argv中的下标值
           optopt;              //选项字符,例如 -c 字符为c
        调用一次getopt_long的结果:
           1)所有的短选项和长选项均解析完,          返回值为-1。
           2)如果碰到的是短选项  
① 选项合法时(即符合短选项规则),返回值为选项字符的ASCII码,optarg指向选项值;
② 选项不合法(短选项规则中没有),返回值为“?”,optopt保存选项字符;
③ 选项合法但缺少选项值, 返回值为“:”,optopt保存选项字符;
           2)如果碰到的是长选项
① 如果长选项合法,
若长选项规则结构体option中对应的flag为NULL,那么返回值为对应的缩写字符,optarg指向选项值;
若长选项规则结构体option中对应的falg不为NULL,那么返回值为0,flag保存缩写字符,optatg指向选项值;
②如果长选项不合法 (未验证过)
若长选项规则结构体option中对应的flag为NULL,那么返回值为“?”,optopt保存选项字符;
若长选项规则结构体option中对应的falg不为NULL,那么返回值为0,flag保存“?”,optopt保存选项字符;
③ 如果长选项不合法,但缺少选项值 (未验证过)
若长选项规则结构体option中对应的flag为NULL,那么返回值为“:”,optopt保存选项字符;
若长选项规则结构体option中对应的falg不为NULL,那么返回值为0,flag保存“:”,optopt保存选项字符;

 

posted @ 2023-11-17 22:54  我就不告诉你我是谁  阅读(102)  评论(0编辑  收藏  举报