直接上代码:涉及函数getopt(),getopt_long()

 #include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <getopt.h> /*
int main(int argc, char *argv[])
{
int opt;
char * optstring = "a:b:c:d"; while ((opt = getopt(argc, argv, optstring)) != -1)
{
printf("opt = %c\n", opt);
printf("optarg = %s\n", optarg);
printf("optind = %d\n", optind);
printf("argv[optind - 1] = %s\n\n", argv[optind - 1]);
} return 0;
}
*/ //getopt_long()和getopt_long_only()函数支持长选项的命令行解析,其中,后者的长选项字串是以一个短横线开始的,而非一对短横线。
int main(int argc, char **argv)
{
int opt;
int digit_optind = ;
int option_index = ;
char *optstring = "a:b:c:d";
static struct option long_options[] = {
{"reqarg", required_argument, NULL, 'r'},
{"noarg", no_argument, NULL, 'n'},
{"optarg", optional_argument, NULL, 'o'},
{, , , }
};
/*
*extern char *optarg; //选项的参数指针
*extern int optind, //下一次调用getopt时,从optind存储的位置处重新开始检查选项
*extern int opterr, //当opterr=0时,getopt不向stderr输出错误信息。
*extern int optopt; //当命令行选项字符不包括在optstring中或者最后一个选项缺少必要的参数时,该选项存储在optopt中,getopt返回'?’
*
*/ while ( (opt = getopt_long(argc, argv, optstring, long_options, &option_index)) != -)
{
printf("opt = %c\n", opt);
printf("optarg = %s\n", optarg);
printf("optind = %d\n", optind);
printf("argv[optind - 1] = %s\n", argv[optind - ]);
printf("option_index = %d\n", option_index);
} return ;
}

  int getopt(int argc, char * const argv[], const char *optstring);

  该函数用来解析命令行参数。前两个参数设为main函数的两个参数。
  optstring设为由该命令要处理的各个选项组成的字符串。选项后面带有冒号':'时,
  该选项是一个带参数的选项。
  例如:make -f filename -n
    -f是一个带参数的选项,-n是一个没有参数的选项。

  可以下面这样调用函数getopt来解析上面的例子。
    c = getopt(argc, argv, "f:n");
  此函数的返回值即为当前找到的命令选项,全部选项都找到时的返回值为-1。
  通常一个命令有多个选项,为了取得所有选项,需要循环调用此函数,直到返回值为-1。

  要使用此函数,还有几个全局变量必须要了解。
    extern char *optarg;  
    extern int optind, opterr, optopt;

    optarg: 当前选项带参数时,optarg指向该参数。
    optind: argv的索引。通常选项参数取得完毕时,通过此变量可以取得非选项参数(argv[optind])
    optopt: 一个选项在argv中有,但在optstring中不存在时,或者一个带参数的选项没有参数时,
         getopt()返回'?',同时将optopt设为该选项。
    opterr: 将此变量设置为0,可以抑制getopt()输出错误信息。

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

                  const char *optstring,
                  const struct option *longopts, int *longindex);

  这是支持长命令选项的函数,长选项以'--'开头。
    前三个参数与函数getopt的参数是一样的。只支持长选项时,参数optstring设置为NULL或者空字符串

  第四个参数是一个构造体struct option的数组。此构造体定义在头文件getopt.h中。
  struct option {
    const char *name;
    int has_arg;
    int *flag;
    int val;
  };

  构造体各个成员的解释如下
    name   : 长选项的名字
    has_arg: no_argument或0表示此选项不带参数,required_argument或1表示此选项带参数,optional_argument或2表示是一个可选选项。
    flag : 设置为NULL时,getopt_long()返回val,设置为NULL以外时,getopt_long()返回0,且将*flag设为val。
    val : 返回值或者*flag的设定值。有些命令既支持长选项也支持短选项,可以通过设定此值为短选项实现。
  此数组的最后一个须将成员都置为0。

  关于返回值有以下几种情况:
    识别为短选项时,返回值为该短选项。
    识别为长选项时,如果flag是NULL的情况下,返回val,如果flag非NULL的情况下,返回0。
    所有选项解析结束时返回-1。
    存在不能识别的选项或者带参数选项的参数不存在时返回'?

c/c++处理参数的更多相关文章

  1. 【.net 深呼吸】细说CodeDom(6):方法参数

    本文老周就给大伙伴们介绍一下方法参数代码的生成. 在开始之前,先补充一下上一篇烂文的内容.在上一篇文章中,老周检讨了 MemberAttributes 枚举的用法,老周此前误以为该枚举不能进行按位操作 ...

  2. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  3. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  4. Scrapy框架爬虫初探——中关村在线手机参数数据爬取

    关于Scrapy如何安装部署的文章已经相当多了,但是网上实战的例子还不是很多,近来正好在学习该爬虫框架,就简单写了个Spider Demo来实践.作为硬件数码控,我选择了经常光顾的中关村在线的手机页面 ...

  5. 【每日一linux命令4】常用参数:

     下面所列的是常见的参数(选项)义: --help,-h                              显示帮助信息 --version,-V                        ...

  6. 【每日一linux命令3】参数(或称选项)顺序

    一般除了特殊情况,参数是没有顺序的.举例而言,输入"–a –v"与输入"–v –a"以及"–av" 的执行效果是相同的.但若该参数后指定了要 ...

  7. C# 中参数验证方式的演变

    一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型参数是否允许为空,如果是字符可能有长度限 ...

  8. js中参数不对应问题

    因为js是一种弱类型的编程语言,对数据类型的要求没有其他编程语言的要求严格,所以在定义函数的时候不需要像java和C#一样对其传入参数的类型进行定义.那么传入参数的个数有没有影响呢?今天小猪就做了个实 ...

  9. C++中的变长参数

    新参与的项目中,为了使用共享内存和自定义内存池,我们自己定义了MemNew函数,且在函数内部对于非pod类型自动执行构造函数.在需要的地方调用自定义的MemNew函数.这样就带来一个问题,使用stl的 ...

  10. nodejs进阶(5)—接收请求参数

    1. get请求参数接收 我们简单举一个需要接收参数的例子 如果有个查找功能,查找关键词需要从url里接收,http://localhost:8000/search?keyword=地球.通过前面的进 ...

随机推荐

  1. C语言 格式说明符

    整数 lL代表long %#0 和%#x 可打印出八进制和十六进制前缀 short int long long long 无符号 八进制 %ho %o %Lo %LLo 十进制 %hu %u %Lu ...

  2. android 添加左右滑屏手势

    今天要在自己的项目中添加左右滑动,实现日期的加减(原来已经做了加减按键).滑动在一个中间的layout中进行 思路:添加左右划屏幕判断,得到判断后模拟加减按键按下. 模拟按键按下用 mbotton.p ...

  3. J2SE知识点摘记(十五)

    1.        字节流和字符流的转换 以字符为导向的stream基本上有与之相对应的以字节为导向的Stream,两个对应类实现的功能相同,只是操作时的导向不同 字节输入流转换为字符输入流: Inp ...

  4. qutIm编译

    官网:http://www.qutim.org/ 原文地址:http://wiki.qutim.org/en/building_from_git 依赖: Qt4-dev 4.7:http://qt-p ...

  5. 前端web应用的组件化(二) 徐飞

    Web应用的组件化(二) https://github.com/xufei/blog/issues/7 管控平台 在上一篇中我们提到了组件化的大致思路,这一篇主要讲述在这么做之后,我们需要哪些外围手段 ...

  6. Largest Rectangle in a Histogram(最大矩形面积,动态规划思想)

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  7. 获取第上一个兄弟元素 屏蔽浏览器的差异(PreviousElementSibling)

    //获取element上一个兄弟元素 function getPreviousElementSibling(element){ //能力检测 判断是否支持PreviousElementSibling ...

  8. pushViewController自定义动画

    实现的主要代码如下: CATransition *transition = [CATransition animation]; transition.duration = 1.0f; transiti ...

  9. liunx操作数据库

    liunx操作数据库 1.连接数据库 #mysql -uroot -p mysql -uroot -p 然后输入密码 2.关闭防火墙 #iptables -stop 开启#iptables -star ...

  10. 并发编程:c++11 多线程中随机数重复问题

    srand(time(NULL)); 是我们熟悉的c++随机函数,用时间做种子.但由于在多线程环境下若想在子线程中随机出不同的随机数则需随机种子的不同.但time以秒计算,略显不足,故参考这篇文章解决 ...