zoukankan      html  css  js  c++  java
  • [置顶] getopt_long函数基本用法-linux

    一、感性认识:

    [c-sharp]  view plain copy
     
    1. #include <stdio.h>  
    2. #include <getopt.h>  
    3. char * l_opt_arg;  
    4. char const short_options = "nbl:"//单冒号表示是否带有参数[l带有参数后面加冒号] 
    5. struct option long_options[] = {  
    6.      { "name",     0,   NULL,    'n'     },  
    7.      { "bf_name",  0,   NULL,    'b'     },  
    8.      { "love",     1,   NULL,    'l'     },  
    9.      {      0,     0,     0,     0},  
    10. };  
    11. /* 
    12. 长选项我们用一个option结构体数组表示长选项的信息:
    13. 第一项:表示长选项的名字。
    14. 第二项:用来决定此长选项是否要带参数。[这里用数值表示]
    15. 第三项:我们一般都置为NULL,用来决定getopt_long函数的返回值就是第四个选项的值
    16. 第四项:是此长选项相对应的短选项值,因此一旦此函数读到此长选项时,就返回与此长选项相对应的短选项
    17. */
    18. int main(int argc, char *argv[])  
    19. {  
    20.      int c;  
    21.      while((c = getopt_long (argc, argv, short_options, long_options, NULL)) != -1)  
    22.      {  
    23.          switch (c)  
    24.          {  
    25.          case 'n':  
    26.              printf("My name is XL./n");  
    27.              break;  
    28.          case 'b':  
    29.              printf("His name is ST./n");  
    30.              break;  
    31.          case 'l':  
    32.              l_opt_arg = optarg;  //optarg代表参数
    33.              printf("Our love is %s!/n", l_opt_arg);  
    34.              break;  
    35.          }  
    36.      }  
    37.      return 0;  
    38. }  

    编译:

    [root@localhost liuxltest]# gcc -o getopt getopt.c

    运行1:

    [root@localhost liuxltest]# ./getopt -n -b -l forever(这个是参数

    My name is XL.

    His name is ST.

    Our love is forever!

    运行2:

    [root@localhost liuxltest]# ./getopt -nb -l forever

    My name is XL.

    His name is ST.

    Our love is forever!

    运行3:

    [root@localhost liuxltest]# ./getopt -nbl forever  

    My name is XL.

    His name is ST.

    Our love is forever!

    二、概念

    getopt_long支持长选项的命令行解析,使用man getopt_long,得到其声明如下:

    #include <getopt.h>

    int getopt_long(int argc, char * const argv[],

    const char *optstring,

    const struct option *longopts, int *longindex);


    说明:

    argcargv通常直接从main()到两个参数传递而来。

    optsting 是选项参数组成的字符串,如果该字符串里任一字母后有冒号,那么这个选项就要求有参数。

    longopts 是指向数组的指针,这个数组是

     struct option {

                  const char *name;

                  int has_arg;

                  int *flag;

                  int val;

        };

    const char *name:

    选项名,前面没有短横线。譬如"help"、"verbose"之类。

    int has_arg:

    描述长选项是否有选项参数,如果有,是哪种类型的参数,其值见下表:

    符号常量                          数值            含义

    no_argument                 0                 选项没有参数

    required_argument      1                 选项需要参数

    optional_argument       2                 选项参数是可选的

    int *flag:

    如果该指针为NULL,那么getopt_long返回val字段的值;

    如果该指针不为NULL,那么会使得它所指向的结构填入val字段的值,同时getopt_long返回0

    int val:

    如果flag是NULL,那么val通常是个字符常量,如果短选项和长选项一致,那么该字符就应该与optstring中出现的这个选项的参数相同;


    longindex 一般赋为NULL即可;如果没有设置为NULL,那么它就指向一个变量,这个变量会被赋值为寻找到的长选项在longopts中的索引值,这可以用于错误诊断。


    几种常用返回值:

    1、每次调用该函数,它都会分析一个选项,并且返回它的短选项,如果分析完毕,即已经没有选项了,则会返回-1。

    2、如果getopt_long()在分析选项时,遇到一个没有定义过的选项,则返回值为‘?’,此时,程序员可以打印出所定义命令行的使用信息给用户。

    3、当处理一个带参数的选项时,全局变量optarg会指向它的参数

    4、当函数分析完所有参数时,全局变量optind(into argv)会指向第一‘非选项’的位置






  • 相关阅读:
    javascript功能插件大集合
    基于Swiper插件的简单轮播图的实现
    LeetCode24. 两两交换链表中的节点
    530. 二叉搜索树的最小绝对差
    416. 分割等和子集
    GAN ——Generative Adversarial Network 理解与推导(一)
    面试题 02.08. 环路检测(返回环路开头节点)
    141.环形链表-LeetCode
    357. 计算各个位数不同的数字个数 ——LeetCode
    LSTM的理解
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3241496.html
Copyright © 2011-2022 走看看