getopt_long, getopt_long_only -- 命令行解析函数,支持长选项解析
 
【说明】getopt_long/getopt_long_only是getopt的泛集,getopt是getopt_long的一个子集,getopt支持的所有特性,getopt_long都支持,包括错误打印、argv元素顺序调整等;getopt_long相比getopt增加了长选项的解析,具体如下:
 
1、形如:cmd [--create][--file] //对长选项的解析;
2、形如:cmd [--create a_argument][-file b_argument] //对长选项及长选项的参数解析;
3、形如:cmd [--create [a_argument]] //选项create的参数也是可选的情况解析
getopt_long_only与getopt_long的区别在于:getopt_long仅仅只能将"--"开始的选项视为长选项,但getopt_long_only将"-"开头选项也会视为长选项,当长选项列表均不满足时,且短选项满足时,"-"才会解析为短选项;
 
原型:

  1. #define _GNU_SOURCE
  2.  
  3. #include <getopt.h>
  4.  
  5. extern char *optarg;
  6.  
  7. extern int optind, opterr, optopt;
  8.  
  9. int getopt_long(int argc, char *const argv[], const char *optstring, const struct option *longopts, int *longindex);
  10.  
  11. int getopt_long_only(int argc, char *const argv[], const char *optstring, const struct option *longopts, int *longindex);

描述:

 
1、注意相比getopt,使用getopt_long需要加头文件<getopt.h>;
2、getopt_long除了会接受长选项,其他概念和getopt是一样的;
3、如果使用getopt_long想只接受短选项,设置longopts为NULL即可;如果只想接受长选项,相应地设置optstring为NULL即可;
4、长选项名是可以使用缩写方式,比如:选项有--file\--create,那么输入--c/--cr/--cre等均会被正确识别为create选项;
5、对于带参数的长选项格式是:--arg=param或--arg param;
6、longopts是指向struct option数组的第一个元素的指针,struct option定义在<getopt.h>中;
7、longindex如果非NULL,则是返回识别到struct option数组中元素的位置指针;
 
struct option的说明:
 
/*
name: 长选项名
has_arg: 是否带参数或可选参数,这个值在getopt.h中有宏定义,如下:
     # define no_argument        0
     # define required_argument  1
     # define optional_argument  2
flag: 确定函数返回值的情况,如果flag==NULL,则识别选项后返回val(常用的如:设置val为长命令的短命令字符);否则,识别后getopt_long返回0,flag指向一个设置到val的变量;
val: 设置为返回值,或者是flag指向的变量;这里要注意不要写-1到val,否则其作用是getopt_long返回-1,然后停止解析选项;
 
[注意] longopts的最后一个元素必须是全0填充,否则会报段错误
*/
 
struct option {
    const char *name; 
    int has_arg;  
    int *flag;
    int val;
};
 
返回值:
 
1、如果识别短选项,同getopt一样返回短选项字符;
2、如果识别长选项,根据flag的设置返回不同的内容,一般flag都设置为NULL,返回val;
3、如果发生错误,如:未识别选项或者必须加参数的选项丢失参数,返回'?',如果在optstring中设置了第一个字符为':',丢失参数返回':',这个同getopt返回时一样的;
4、当缩写长选项引起歧义时或者不需要的选项强加了参数,都会返回'?';
5、返回-1表示选项处理全部结束;
6、如果在输入的argv[]中包含了独立的"--"字符串,同getopt一样,解析到这里返回-1,停止选项的解析;
 
测试实例:

  1. #include <stdio.h>
  2.  
  3. #include <stdlib.h>
  4.  
  5. #include <getopt.h>
  6.  
  7. int main(int argc, char **argv)
  8.  
  9. {
  10.  
  11. extern char *optarg;
  12.  
  13. extern int optind, opterr, optopt;
  14.  
  15. int c;
  16.  
  17. int digit_optind = ;
  18.  
  19. while ()
  20.  
  21. {
  22.  
  23. int this_option_optind= optind ? optind : ;
  24.  
  25. int option_index = ;
  26.  
  27. static struct option long_options[] =
  28.  
  29. {
  30.  
  31. {"add", required_argument, NULL, },
  32.  
  33. {"append", no_argument, NULL, },
  34.  
  35. {"delete", required_argument, NULL, },
  36.  
  37. {"verbose", no_argument, NULL, },
  38.  
  39. {"create", required_argument, NULL, 'c'},
  40.  
  41. {"file", required_argument, NULL, },
  42.  
  43. {, , , },
  44.  
  45. };
  46.  
  47. c = getopt_long(argc, argv, ":abc:d:012", long_options, &option_index);
  48.  
  49. if (c == -)
  50.  
  51. break;
  52.  
  53. switch (c)
  54.  
  55. {
  56.  
  57. case :
  58.  
  59. printf ("option %s", long_options[option_index].name);
  60.  
  61. if (optarg)
  62.  
  63. printf (" with arg %s", optarg);
  64.  
  65. printf ("\n");
  66.  
  67. break;
  68.  
  69. case '':
  70.  
  71. case '':
  72.  
  73. case '':
  74.  
  75. if (digit_optind != && digit_optind != this_option_optind)
  76.  
  77. printf ("digits occur in two different argv-elements.\n");
  78.  
  79. digit_optind = this_option_optind;
  80.  
  81. printf ("option %c\n", c);
  82.  
  83. break;
  84.  
  85. case 'a':
  86.  
  87. printf ("option a\n");
  88.  
  89. break;
  90.  
  91. case 'b':
  92.  
  93. printf ("option b\n");
  94.  
  95. break;
  96.  
  97. case 'c':
  98.  
  99. printf ("option c with value \"%s\"\n", optarg);
  100.  
  101. break;
  102.  
  103. case 'd':
  104.  
  105. printf ("option d with value \"%s\"\n", optarg);
  106.  
  107. break;
  108.  
  109. case '?':
  110.  
  111. break;
  112.  
  113. default:
  114.  
  115. printf ("?? getopt returned character code 0%o ??\n", c);
  116.  
  117. }
  118.  
  119. }
  120.  
  121. if (optind < argc) {
  122.  
  123. printf ("non-option ARGV-elements: ");
  124.  
  125. while (optind < argc)
  126.  
  127. printf ("%s ", argv[optind++]);
  128.  
  129. printf ("\n");
  130.  
  131. }
  132.  
  133. exit();
  134.  
  135. }

运行自行操作测试

getopt_long 函数的更多相关文章

  1. getopt_long函数使用【转】

    转自:https://blog.csdn.net/cashey1991/article/details/7942809 平时在写程序时常常需要对命令行参数进行处理,当命令行参数个数较多时,如果按照顺序 ...

  2. 命令行参数解析函数getopt和getopt_long函数【转】

    原文地址:http://blog.csdn.net/cashey1991/article/details/7942809 getopt和getopt_long函数   平时在写程序时常常需要对命令行参 ...

  3. getopt() getopt_long()函数手册[中文翻译]

    getopt()函数 getopt_long函数 函数原型(function prototype) #include <unistd.h> int getopt(int argc, cha ...

  4. [置顶] getopt_long函数基本用法-linux

    一.感性认识: [c-sharp]  view plain copy   #include <stdio.h> #include <getopt.h> char * l_opt ...

  5. Linux getopt()函数 getopt_long()函数---转

    http://hi.baidu.com/scoundrelgg/item/d4083f8412eea05d26ebd97f Linux getopt()函数 getopt_long()函数 get_o ...

  6. C语言中getopt()和getopt_long()函数的用法

    一.参考文章 1.C语言中getopt()和getopt_long()函数的用法 2.linux 中解析命令行参数 (getopt_long用法) 二.调试经验

  7. 命令行參数选项处理:getopt()及getopt_long()函数使用

         在执行某个程序的时候,我们通常使用命令行參数来进行配置其行为.命令行选项和參数控制 UNIX 程序,告知它们怎样动作. 当 gcc的程序启动代码调用我们的入口函数 main(int argc ...

  8. webbench源码学习-->命令行选项解析函数getopt和getopt_long函数

    对于webbench这个网站压力测试工具网上介绍的很多,有深度详解剖析的,对于背景就不在提了, 听说最多可以模拟3万个并发连接去测试网站的负载能力,这里主要是学习了一下它的源码,做点 笔记. 官方介绍 ...

  9. getopt_long函数解析命令行参数

    转载:http://blog.csdn.net/hcx25909/article/details/7388750 每一天你都在使用大量的命令行程序,是不是感觉那些命令行参数用起来比较方便,他们都是使用 ...

随机推荐

  1. 家谱(gen)——洛谷P2814

    #include <iostream> #include <string> #include <map> using namespace std; map < ...

  2. 天翼云 RDS数据库操作

    1.RDS数据库创建好之后点击RDS实例管理找到已下信息 官方文档 -1:http://www.ctyun.cn/help/qslist/567 官方文档 -2:http://www.ctyun.cn ...

  3. elementUI 时间选择器,时间选择快捷键

    elementUI的时间快捷键,使用属性:picker-options="pickerOptions",由于pickerOptions的定义很长,也在其他地方共用,因此建议提取出来 ...

  4. 【hihocoder 1475】 数组分拆

    [题目链接]:http://hihocoder.com/problemset/problem/1475 [题意] _< [题解] /* 别人的题解 首先对于每个位置预处理数组的前缀和,即s[i] ...

  5. Set Time, Date Timezone in Linux from Command Line or Gnome | Use ntp

    https://www.garron.me/en/linux/set-time-date-timezone-ntp-linux-shell-gnome-command-line.html Set ti ...

  6. VMware 12安装CentOS 6.9时出现:The centos disc was not found in any of your drives.Please insert the centos disc and press OK to retry

    错误: The centos disc was not found in any of your drives.Please insert the centos disc and press OK t ...

  7. HDU多校赛第9场 HDU 4965Fast Matrix Calculation【矩阵运算+数学小知识】

    难度上.,,确实...不算难 问题是有个矩阵运算的优化 题目是说给个N*K的矩阵A给个K*N的矩阵B(1<=N<=1000 && 1=<K<=6),先把他们乘起 ...

  8. 几种new

    http://www.cnblogs.com/luxiaoxun/archive/2012/08/10/2631812.html new .operator new 和 placement new 区 ...

  9. Yarn的工作流程

    http://study.163.com/course/courseLearn.htm?courseId=1002887002#/learn/video?lessonId=1003346099& ...

  10. HDOJ 5421 Victor and String 回文串自己主动机

    假设没有操作1,就是裸的回文串自己主动机...... 能够从头部插入字符的回文串自己主动机,维护两个last点就好了..... 当整个串都是回文串的时候把两个last统一一下 Victor and S ...