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将"-"开头选项也会视为长选项,当长选项列表均不满足时,且短选项满足时,"-"才会解析为短选项;
 
原型:

#define _GNU_SOURCE

#include <getopt.h>

extern char *optarg;

extern int optind, opterr, optopt;

int getopt_long(int argc, char *const argv[], const char *optstring, const struct option *longopts, int *longindex);

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,停止选项的解析;
 
测试实例:

#include <stdio.h>

#include <stdlib.h>

#include <getopt.h>

int main(int argc, char **argv)

{

        extern char *optarg;

        extern int optind, opterr, optopt;

        int c;

        int digit_optind = ;

        while ()

        {

                int this_option_optind= optind ? optind : ;

                int option_index = ;

                static struct option long_options[] =

                {

                        {"add", required_argument, NULL, },

                        {"append", no_argument, NULL, },

                        {"delete", required_argument, NULL, },

                        {"verbose", no_argument, NULL, },

                        {"create", required_argument, NULL, 'c'},

                        {"file", required_argument, NULL, },

                        {, , , },

                };

                c = getopt_long(argc, argv, ":abc:d:012", long_options, &option_index);

                if (c == -)

                        break;

                switch (c)

                {

                        case :

                                printf ("option %s", long_options[option_index].name);

                                if (optarg)

                                        printf (" with arg %s", optarg);

                                printf ("\n");

                                break;

                        case '':

                        case '':

                        case '':

                                if (digit_optind !=  && digit_optind != this_option_optind)

                                        printf ("digits occur in two different argv-elements.\n");

                                digit_optind = this_option_optind;

                                printf ("option %c\n", c);

                                break;

                        case 'a':

                                printf ("option a\n");

                                break;

                        case 'b':

                                printf ("option b\n");

                                break;

                        case 'c':

                                printf ("option c with value \"%s\"\n", optarg);

                                break;

                        case 'd':

                                printf ("option d with value \"%s\"\n", optarg);

                                break;

                        case '?':

                                break;

                        default:

                                printf ("?? getopt returned character code 0%o ??\n", c);

                }

        }

        if (optind < argc) {

                 printf ("non-option ARGV-elements: ");

                 while (optind < argc)

                          printf ("%s ", argv[optind++]);

                 printf ("\n");

         }

        exit();

}

运行自行操作测试

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. Linux C(day01)

    Linux是一个和Windows类似的操作系统 通常通过终端软件使用Linux操作系统 终端软件里只能使用键盘不能使用鼠标 可以在终端软件里输入各种命令控制计算机 完成各种任务 clear命令可以清除 ...

  2. 一维数组快速转集合(List)

    String[] arr={"qwe","asd","zxc","asddf","hghgf"}; ...

  3. lucene_07_solr使用IK分词器

    使用IKAnalyzer 中文分析器.. 第一步: 把,IKAnalyzer2012FF_u1j 添加到sol/WEB-INF/lib 目录下. 第二步: 复制IKAnalyzer 的配置文件和自定义 ...

  4. netty自定义协议 心跳 断线重连源码

    https://github.com/aa1356889/NettyHeartbeat

  5. States of Integrity Constraints

    States of Integrity Constraints As part of constraint definition, you can specify how and when Oracl ...

  6. CentOS6.2上安装Oracle10g报ins_emdb.mk错误处理方法

    oracle安装过程报ins_emdb.mk错误,此时继续点击“continue”即可,待Oracle完成安装后,再手工执行相应脚本完成链接即可 在CentOS6.2操作系统上,安装Oracle10g ...

  7. session_start() [function.session-start]:

    我在学习PHP的,当我尝试做在session_start() - 获取有关错误信息不能发送会话cookie. 我看到在这个问题上前面的问题,可是,仍然不能确定我的错误. 假设是错误家伙? <? ...

  8. 黑马day01 笔记

    一.xml语法   1.文档声明     用来声明xml的基本属性,用来指挥解析引擎怎样去解析当前xml     通常一个xml都要包括而且仅仅能包括一个文档声明     xml的文档必须在整个xml ...

  9. linux下的oom调试笔记【原创】

    平台信息:内核:linux3.0.68 系统:android/android5.1平台:s5p4418 作者:庄泽彬(欢迎转载,请注明作者) 邮箱:2760715357@qq.com 摘要:调整and ...

  10. 国内物联网平台初探(一) ——百度物接入IoT Hub

    物接入IoT Hub - 架构 全托管的云服务,帮助建立设备与云端之间安全可靠的双向连接 支撑海量设备的数据收集.监控.故障预测等各种物联网场景 物接入IoT Hub - 功能 通信协议:支持MQTT ...