getopt(分析命令行参数)  
 
相关函数表头文件
        #include<unistd.h>
定义函数
        int getopt(int argc,char * const argv[ ],const char * optstring);
函数说明
        getopt()用来分析命令行参数。参数argc和argv是由main()传递的参数个数和内容。参数optstring 则代表欲处理的选项字符串。此函数会返回在argv 中下一个的选项字母,此字母会对应参数optstring 中的字母。如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量optarg 即会指向此额外参数。如果getopt()找不到符合的参数则会印出错信息,并将全域变量optopt设为“?”字符,如果不希望getopt()印出错信息,则只要将全域变量opterr设为0即可。
 
短参数的定义

       getopt()使用optstring所指的字串作为短参数列表,象"1ac:d::"就是一个短参数列表。短参数的定义是一个'-'后面跟一个字母或数字,象-a, -b就是一个短参数。每个数字或字母定义一个参数。 
  其中短参数在getopt定义里分为三种:
  1. 不带值的参数,它的定义即是参数本身。
  2. 必须带值的参数,它的定义是在参数本身后面再加一个冒号。
  3. 可选值的参数,它的定义是在参数本身后面加两个冒号 。
 
  在这里拿上面的"1ac:d::"作为样例进行说明,其中的1,a就是不带值的参数,c是必须带值的参数,d是可选值的参数。
  在实际调用中,'-1 -a -c cvalue -d', '-1 -a -c cvalue -ddvalue', '-1a -ddvalue -c cvalue'都是合法的。
 
  这里需要注意三点:
  1. 不带值的参数可以连写,象1和a是不带值的参数,它们可以-1 -a分开写,也可以-1a或-a1连写。
  2. 参数不分先后顺序,'-1a -c cvalue -ddvalue'和'-d -c cvalue -a1'的解析结果是一样的。
  3. 要注意可选值的参数的值与参数之间不能有空格,必须写成-ddvalue这样的格式,如果写成-d dvalue这样的格式就会解析错误。
返回值
   getopt()每次调用会逐次返回命令行传入的参数。
   当没有参数的最后的一次调用时,getopt()将返回-1。
   当解析到一个不在optstring里面的参数,或者一个必选值参数不带值时,返回'?'。
   当optstring是以':'开头时,缺值参数的情况下会返回':',而不是'?' 。
 
 
c.c文件
  1. #include <stdio.h>
  2. #include <unistd.h>
  3.  
  4. int main(int argc, char **argv)
  5. {
  6. int ch;
  7. opterr = 0;
  8. while ((ch = getopt(argc,argv,"a:bcde::f"))!=-1)
  9. {
  10. switch(ch)
  11. {
  12. case 'a':
  13. printf("option a:'%s'\n",optarg);
  14. break;
  15. case 'b':
  16. printf("option b :b\n");
  17. break;
  18. case 'e':
  19. printf("option e:'%s'\n",optarg);
  20. break;
  21. default:
  22. printf("other option :%c\n",ch);
  23. }
  24. }
  25. printf("optopt +%c\n",optopt);
  26.  
  27. return 1;
  28. }

运行结果:

  1. ~ Home$ ./c -a
  2. other option :?
  3. optopt +a
  4. ~ Home$ ./c -a
  5. option a:''
  6. optopt +a
  7. ~ Home$ ./c -a123
  8. option a:''
  9. optopt +a
  10. ~ Home$ ./c -b
  11. option b :b
  12. optopt +b
  13. ~ Home$ ./c -cde
  14. other option :c
  15. other option :d
  16. other option :?
  17. optopt +e
  18. ~ Home$ ./c -e
  19. other option :?
  20. optopt +e
  21. ~ Home$ ./c -e123
  22. option e:''
  23. optopt +e
  24. ~ Home$ ./c -e
  25. option e:''
  26. optopt +e
  27. ~ Home$ ./c -f
  28. other option :f
  29. optopt +f
  30. ~ Home$ ./c -a -bcdf -e
  31. option a:''
  32. option b :b
  33. other option :c
  34. other option :d
  35. other option :f
  36. option e:''
  37. optopt +e

当optstring(":a:bcde::f")是以':'开头时,缺值参数的情况下会返回':',而不是'?' 。

getopt(argc,argv,":a:bcde::f")  
  1. 1 $ ./c -a
  2. 2 other option ::
  3. 3 optopt +a

可变optstring

  1. #include <stdio.h>
  2. #include <unistd.h>
  3.  
  4. #ifdef RDP2
  5. #define VNCOPT "V:Q"
  6. #else
  7. #define VNCOPT "V:"
  8. #endif
  9.  
  10. int main(int argc, char **argv)
  11. {
  12. int ch;
  13. opterr = ;
  14. while ((ch = getopt(argc,argv, VNCOPT ":a:bcde::f"))!=-)
  15. {
  16. switch(ch)
  17. {
  18. case 'V':
  19. printf("option V:'%s'\n",optarg);
  20. break;
  21. case 'a':
  22. printf("option a:'%s'\n",optarg);
  23. break;
  24. case 'b':
  25. printf("option b :b\n");
  26. break;
  27. case 'e':
  28. printf("option e:'%s'\n",optarg);
  29. break;
  30. default:
  31. printf("other option :%c\n",ch);
  32. }
  33. }
  34. printf("optopt +%c\n",optopt);
  35.  
  36. return ;
  37. }

reference:

http://vopit.blog.51cto.com/2400931/440453

 
 

[c language] getopt的更多相关文章

  1. [c language] getopt 其参数optind 及其main(int argc, char **argv) 参数解释

    getopt被用来解析命令行选项参数.#include <unistd.h> extern char *optarg; //选项的参数指针extern int optind, //下一次调 ...

  2. go语言项目汇总

    Horst Rutter edited this page 7 days ago · 529 revisions Indexes and search engines These sites prov ...

  3. Golang优秀开源项目汇总, 10大流行Go语言开源项目, golang 开源项目全集(golang/go/wiki/Projects), GitHub上优秀的Go开源项目

    Golang优秀开源项目汇总(持续更新...)我把这个汇总放在github上了, 后面更新也会在github上更新. https://github.com/hackstoic/golang-open- ...

  4. 使用 getopt() 进行命令行处理

    引言 在早期的 UNIX® 中,其命令行环境(当时的唯一用户界面)包含着数十种小的文本处理工具.这些工具非常小,通常可很好地完成一项工作.这些工具通过较长的命令管道链接在一起,前面的程序将其输出传递给 ...

  5. [记录]Shell中的getopts和getopt用法

    Shell中的getopts和getopt用法 1.getopts getopts(shell内置命令)不能直接处理长的选项(如:--prefix=/home等),getopts有两个参数,第一个参数 ...

  6. Java中的GetOpt操作

    在shell工具中,有专门的getopt函数,使用方法如下所示: while getopts "d:t:vh" opt; do case "${opt}" in ...

  7. Shell 参数(2) --解析命令行参数工具:getopts/getopt

    getopt 与 getopts 都是 Bash 中用来获取与分析命令行参数的工具,常用在 Shell 脚本中被用来分析脚本参数. 两者的比较 (1)getopts 是 Shell 内建命令,geto ...

  8. getopt使用

    参考: http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html http://en.wikipedia.org ...

  9. getopt,getoptlong学习

         getopt和getoptlong被用来解析命令行参数.   一.getopt #include <unistd.h> extern char *optarg; extern i ...

随机推荐

  1. phpmyadmin开启远程服务器连接

     1.修改 braries/config.default.php,将 $cfg['AllowArbitraryServer'] 的值由 false 改成 true. 2.有其他需求的也可以自己在这里修 ...

  2. 安装python3.4

    1.http://www.python.org下载适合自己机型的镜像文件 2.一路“next”到底,安装python到C盘上 3.计算机-属性-高级系统设置-环境变量,将刚刚安装的python路径添加 ...

  3. 阿铭linux笔记

    2015-09-06虚拟机网络设置.wmv: curl     获取在命令行显示的网页 dhclient     分配ip地址 ifdown eth0     关闭网卡eth0 ifup eh0   ...

  4. JS 没有块级作用域

    在函数(方法)中声明的所有变量,他们在整个函数中都有定义 var scope="abc"; function f() { alert(scope);  //显示undefine v ...

  5. nodejs+express Mvc站点

    nodejs+express Mvc站点 像asp.net Mvc一样开发nodejs+express Mvc站点 首先,我是个c#码农.从事Mvc开发已然4个年头了,这两年前端MVC的兴起,我也跟风 ...

  6. Ext4.0.7使用Ext.grid.ColumnModel报错:TypeError: Ext.grid.Model is not a constructor

    代码如下: Ext.onReady(function(){ //定义列 var cm = new Ext.grid.ColumnModel([ {header: '编号', dataIndex: 'i ...

  7. position 为absolute时/float 为right,span为block

    元素分为内联元素和区块元素两类(当然也有其它的),在内联元素中有个非常重要的常识,即内两元素是不可以设置区块元素所具有的样式,例如:width | height.relative : 原来是什么类型的 ...

  8. hdu3410-Passing the Message(RMQ,感觉我写的有点多此一举。。。其实可以用单调栈)

    What a sunny day! Let’s go picnic and have barbecue! Today, all kids in “Sun Flower” kindergarten ar ...

  9. HTTP 协议实现

    一.超文本传输协议及HTTP包    HTTP协议用于在Internet上发送和接收消息.HTTP协议是一种请求-应答式的协议--客户端发送一个请求,服务器返回该请求的应答,所有的请求与应答都是HTT ...

  10. Linux下使用JNI的常见问题及解决方案

    JNI是java和C/C++混合编程的接口,可以很方便地实现java调用C/C++语言.具体的使用方法,网上有很多教程,在此不做过多介绍.本博客只关注在使用JNI的过程中的常见问题. 1.     生 ...