http://blog.sina.com.cn/s/blog_64ba2b750100vz5b.html

getopt被用来解析命令行选项参数。

#include <unistd.h>
       extern char *optarg;  //选项的参数指针
       extern int optind,   //下一次调用getopt的时,从optind存储的位置处重新开始检查选项。 
       extern int opterr,  //当opterr=0时,getopt不向stderr输出错误信息。
       extern int optopt;  //当命令行选项字符不包括在optstring中或者选项缺少必要的参数时,该选项存储在optopt 中,getopt返回'?’、
       int getopt(int argc, char * const argv[], const char *optstring);
 调用一次,返回一个选项。 在命令行选项参数再也检查不到optstring中包含的选项时,返回-1,同时optind储存第一个不包含选项的命令行参数。

首先说一下什么是选项,什么是参数。

1.单个字符,表示选项,

2.单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。
3 单个字符后跟两个冒号,表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(这个特性是GNU的扩张)。

例如gcc -g -o test test.c ,其中g和o表示选项,test为选项o的参数。

上面是getopt()函数的基本含义,大家懂得了这些之后,我们一个例子加深一下理解。

例如我们这样调用getopt(argc, argv, "ab:c:de::");
从上面我们可以知道,选项a,d没有参数,选项b,c有一个参数,选项e有有一个参数且必须紧跟在选项后不能以空格隔开。getopt首先扫描argv[1]到argv[argc-1],并将选项及参数依次放到argv数组的最左边,非选项参数依次放到argv的最后边。

执行程序为:
      0      1    2    3  4   5      6   7    8   9 
$ ./test file1 -a  -b -c code -d file2 -e file3
  扫描过程中,optind是下一个选项的索引, 非选项参数将跳过,同时optind增1。optind初始值为1。当扫描argv[1]时,为非选项参数,跳过,optind=2;扫描到-a选项时, 下一个将要扫描的选项是-b,则optind更改为3;扫描到-b选项时,后面有参数(会认为-c为选项b的参数),optind=5,扫描到code非选项跳过optind=6;扫描到-d选项,后面没有参数,optind=7;扫描到file2非选项跳过optind=8;扫描到-e后面本来应该有参数,optind=9但是有空格所以e的参数为空。
 
扫描结束后,getopt会将argv数组修改成下面的形式
       0     1   2   3   4    5   6        7      8      9

$ ./test  -a  -b  -c  -d  -e  file1  code  file2  file3
 
同时,optind会指向非选项的第一个参数,如上面,optind将指向file1
代码如下:
#include <unistd.h>
#include <stdio.h>
int main(int argc, char * argv[])
{
    int aflag=0, bflag=0, cflag=0;
    int ch;
printf("optind:%d,opterr:%d\n",optind,opterr);
printf("--------------------------\n");
    while ((ch = getopt(argc, argv, "ab:c:de::")) != -1)
    {
        printf("optind: %d,argc:%d,argv[%d]:%s\n", optind,argc,optind,argv[optind]);
        switch (ch) {
        case 'a':
            printf("HAVE option: -a\n\n");
    
            break;
        case 'b':
            printf("HAVE option: -b\n");
         
            printf("The argument of -b is %s\n\n", optarg);
            break;
        case 'c':
            printf("HAVE option: -c\n");
            printf("The argument of -c is %s\n\n", optarg);

break;
    case 'd':
        printf("HAVE option: -d\n");
        break;
    case 'e':
        printf("HAVE option: -e\n");
        printf("The argument of -e is %s\n\n", optarg);
        break;

case '?':
            printf("Unknown option: %c\n",(char)optopt);
            break;
        }
    }
    printf("----------------------------\n");
    printf("optind=%d,argv[%d]=%s\n",optind,optind,argv[optind]);
}
执行结果:
shiqi@wjl-desktop:~/code$ vim getopt.c
shiqi@wjl-desktop:~/code$ gcc getopt.c -o g
shiqi@wjl-desktop:~/code$ ./g file1 -a  -b -c code -d file2 -e file3
optind:1,opterr:1
--------------------------
optind: 3,argc:10,argv[3]:-b
HAVE option: -a

optind: 5,argc:10,argv[5]:code
HAVE option: -b
The argument of -b is -c

optind: 7,argc:10,argv[7]:file2
HAVE option: -d

optind: 9,argc:10,argv[9]:file3
HAVE option: -e
The argument of -e is (null)

----------------------------
optind=6,argv[6]=file1         //while循环执行完后,optind=6

函数getopt(),及其参数optind相关推荐

  1. C语言解析命令行函数:getopt系列

    头文件:/usr/include/getopt.h 函数传入较长参数 函数getopt_long_only和getopt_long两者用法差不多,都可以用来解析命令行选项 函数出处 #include ...

  2. c语言命令行选项处理函数getopt和getopt_long() 函数使用

    经常接触Linux的同学应该有这样的体验,当遇到一个不会使用的命令时通常敲一下xCmd -h或者xCmd --help来获取命令提示,例如tcpdump命令或者iptables命令,像这样的选项仅仅是 ...

  3. Go 学习笔记(61)— Go 高阶函数、函数作为一等公民(函数作为输入参数、返回值、变量)的写法

    函数在 Go 语言中属于"一等公民(First-Class Citizen)"拥有"一等公民"待遇的语法元素可以如下使用 可以存储在变量中: 可以作为参数传递给 ...

  4. Python 函数的可变参数(*paramter与**paramter)的使用

    Python 函数的可变参数主要有 *paramter与**paramter 可变参数主要有 *paramter的作用 接受任意多个实际参数并放到一个元组中 def people(*people):f ...

  5. Python函数中的参数(一)

    函数传递参数时的简要关键点: 1.参数的传递是通过自动将对象赋值给本地变量名来实现的.函数参数在实际中只是Python赋值的一个实例.因为引用是以指针的形式实现的,所有的参数实际上都是通过指针进行传递 ...

  6. 《C++面向对象高效编程(第2版)》——3.11 类名、成员函数名、参数类型和文档...

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第3章,第3.11节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区 ...

  7. R语言ggplot2可视化分面图(facet_grid)、自定义缩小分面图标签栏的高度、但是不改变标签栏标签文本的大小、通过element_text函数的margin参数设置实现

    R语言ggplot2可视化分面图(facet_grid).自定义缩小分面图标签栏的高度.但是不改变标签栏标签文本的大小.通过element_text函数的margin参数设置实现 目录

  8. python使用statsmodels包中的tsaplots函数和lags参数可视化时间序列数据指定滞后位置个数(级别)以前的所有自相关性(plot the autocorrelation)

    python使用statsmodels包中的tsaplots函数和lags参数可视化时间序列数据指定滞后位置个数(级别)以前的所有自相关性(plot the autocorrelation Funct ...

  9. python使用matplotlib可视化、使用annotate函数以及arrowprops参数在可视化图像中添加箭头和文本注释(arrow and text annotation)

    python使用matplotlib可视化.使用annotate函数以及arrowprops参数在可视化图像中添加箭头和文本注释(arrow and text annotation) 目录

  10. pandas使用drop_duplicates函数基于subset参数指定的数据列子集删除重复行、并设置keep参数保留重复行中的最后一个数据行

    pandas使用drop_duplicates函数基于subset参数指定的数据列子集删除重复行.并设置keep参数保留重复行中的最后一个数据行 目录

最新文章

  1. DirectShow基础编程 最简单的源Filter的编写步骤 (转)
  2. c语言指针底层实现,C语言二级指针底层实现
  3. MIMIC 以太坊医疗项目开发(6)Web3智能合约API
  4. How are SAP ui5 Control Aggregation getter and setter are designed
  5. ajax status php,解决laravel 出现ajax请求419(unknown status)的问题
  6. 【飞秋教程】文件断点续传
  7. 海报psd素材模板|周年海报,仪式感值得珍藏
  8. mysql的三个故障解决小结
  9. 整个电脑键盘被锁住了_轻巧便携:罗技Pebble鹅卵石轻薄鼠标+K380蓝牙键盘上手体验...
  10. Web服务稳定性测试 负载测试 可靠性测试 方案 测试报告
  11. swagger 常用注解
  12. Pytorch控制打印矩阵的格式
  13. BGA返修台使用说明
  14. iOS AddressBook
  15. python求个位十位百位_Js 分别取一个数的百位,十位,个位
  16. Photoshop文字排版小技巧。
  17. 下列哪个不是java中注释,下面那些选项是Java中的注释方式:
  18. ubuntu(18.04)磁盘空间不足导致问题:bash: 无法为立即文档创建临时文件: 设备上没有空间(按tab键无法自动补全)
  19. 一些我平常用到的软件
  20. win10设置默认浏览器

热门文章

  1. ElementUI 年份范围选择器
  2. Android组件安全
  3. Neo4j 完整版安装——neo4j-3.5.6
  4. 360度无死角 | Pulsar与Kafka对比全解析
  5. 天大《西方经济学》大作业期末考核
  6. springboot微信公众号发送模板消息
  7. CodeLite IDE for windows (一)安装及HelloWorld
  8. python写字典_Python-字典
  9. 飞哥新书在京东图书品类日科技榜斩获第一名!!
  10. 用户分群模型,这么建才有用