1.getopt

1.1 函数定义

  1. int getopt(int argc, char * const argv[], const char *optstring);#include <unistd.h>

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

例如:make -f filename -n
-f是一个带参数的选项,-n是一个没有参数的选项。

可以下面这样调用函数getopt来解析上面的例子。

  1. c = getopt(argc, argv, "f:n");

此函数的返回值即为当前找到的命令选项,全部选项都找到时的返回值为-1。通常一个命令有多个选项,为了取得所有选项,需要循环调用此函数,直到返回值为-1。
要使用此函数,还有几个全局变量必须要了解。

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

1.2 实例

  1. #include <unistd.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4.  
  5. int main(int argc, char *argv[ ])
  6. {
  7. int c;
  8. ;
  9. ];
  10. ];
  11.  
  12. )
  13. {
  14. printf(]);
  15. ;
  16. }
  17.  
  18. opterr = ;
  19.  
  20. )
  21. {
  22. switch (c)
  23. {
  24. case 'f':
  25. strncpy(filename, optarg, );
  26.  
  27. break;
  28. case 'n':
  29. flg = ;
  30.  
  31. break;
  32. case '?':
  33. default:
  34. printf(]);
  35. ;
  36. }
  37. }
  38.  
  39. if (argv[optind] == NULL)
  40. {
  41. printf(]);
  42. ;
  43. }
  44. else
  45. {
  46. strncpy(testdata, argv[optind], );
  47. }
  48.  
  49. printf("fliename:%s flg:%d testdata:%s\n", filename, flg, testdata);
  50.  
  51. ;
  52. }

2. getopt_long

2.1 函数定义

  1. int getopt_long(int argc, char * const argv[],
  2. const char *optstring,
  3. const struct option *longopts, int *longindex);
  4. #include <getopt.h>

这是支持长命令选项的函数,长选项以'--'开头。前三个参数与函数getopt的参数是一样的。只支持长选项时,参数optstring设置为NULL或者空字符串""。第四个参数是一个构造体struct option的数组。此构造体定义在头文件getopt.h中。

  1. struct option {
  2. const char *name;
  3. int has_arg;
  4. int *flag;
  5. int val;
  6. };
  1. 构造体各个成员的解释如下
  2. name : 长选项的名字
  3. has_arg: no_argument0表示此选项不带参数,required_argument1表示此选项带参数,optional_argument2表示是一个可选选项。
  4. flag : 设置为NULL时,getopt_long()返回val,设置为NULL以外时,getopt_long()返回0,且将*flag设为val
  5. val : 返回值或者*flag的设定值。有些命令既支持长选项也支持短选项,可以通过设定此值为短选项实现。
  6. 此数组的最后一个须将成员都置为0
  7. 第五个参数是一个输出参数,函数getopt_long()返回时,longindex的值是struct option数组的索引。
  8.  
  9. 关于返回值有以下几种情况:
  10. 识别为短选项时,返回值为该短选项。
  11. 识别为长选项时,如果flagNULL的情况下,返回val,如果flagNULL的情况下,返回0
  12. 所有选项解析结束时返回-1
  13. 存在不能识别的选项或者带参数选项的参数不存在时返回'?'

2.2 实例

  1. #include <stdio.h> /* for printf */
  2. #include <stdlib.h> /* for exit */
  3. #include <getopt.h>
  4.  
  5. int main(int argc, char **argv)
  6. {
  7. int c;
  8. ;
  9. ;
  10.  
  11. ) {
  12. ;
  13. ;
  14. static struct option long_options[] = {
  15. {, },
  16. {, },
  17. {, },
  18. {, },
  19. {, 'c'},
  20. {, 'f'},
  21. {, , , }
  22. };
  23.  
  24. c = getopt_long_only(argc, argv, "abc:d:f:012", long_options, &option_index);
  25. )
  26. break;
  27.  
  28. switch (c) {
  29. :
  30. printf("option %s", long_options[option_index].name);
  31.  
  32. if (optarg)
  33. printf(" with arg %s", optarg);
  34.  
  35. printf("\n");
  36. break;
  37.  
  38. ':
  39. ':
  40. ':
  41. && digit_optind != this_option_optind)
  42. printf("digits occur in two different argv-elements.\n");
  43. digit_optind = this_option_optind;
  44. printf("option %c\n", c);
  45. break;
  46.  
  47. case 'a':
  48. printf("option a\n");
  49. break;
  50.  
  51. case 'b':
  52. printf("option b\n");
  53. break;
  54.  
  55. case 'c':
  56. printf("option c with value '%s'\n", optarg);
  57. break;
  58.  
  59. case 'd':
  60. printf("option d with value '%s'\n", optarg);
  61. break;
  62. case 'f':
  63. printf("option f with value '%s'\n", optarg);
  64. break;
  65. case '?':
  66. break;
  67.  
  68. default:
  69. printf("?? getopt returned character code 0%o ??\n", c);
  70. }
  71. }
  72.  
  73. if (optind < argc) {
  74. printf("non-option ARGV-elements: ");
  75. while (optind < argc)
  76. printf("%s ", argv[optind++]);
  77. printf("\n");
  78. }
  79.  
  80. exit(EXIT_SUCCESS);
  81. }

apue编程之getopt ,getopt_long使用方法以及实例的更多相关文章

  1. Android编程之LayoutInflater的inflate方法实例

    假设你不关心其内部实现,仅仅看怎样使用的话,直接看这篇就可以. 接上篇,接下来,就用最最简单的样例来说明一下: 用两个布局文件main 和 test: 当中,main.xml文件为: <?xml ...

  2. Android编程之LayoutInflater的inflate方法详解

    LayoutInflater的inflate方法,在fragment的onCreateView方法中经常用到: public View onCreateView(LayoutInflater infl ...

  3. Android编程之LayoutInflater的inflate方法具体解释

    LayoutInflater的inflate方法,在fragment的onCreateView方法中经经常使用到: public View onCreateView(LayoutInflater in ...

  4. 并发编程之 Thread 类过期方法和常用方法

    前言 在 Java 刚诞生时,Thread 类就已经有了很多方法,但这些方法由于一些原因(有一些明显的bug或者设计不合理)有些已经废弃了,但是他们的方法名却是非常的好,真的是浪费.我们在进行并发必编 ...

  5. Linux下多进程编程之exec函数语法及使用实例

    exec函数族 1)exec函数族说明 fork()函数用于创建一个子进程,该子进程几乎复制了父进程的全部内容,但是,这个新创建的进程如何执行呢?exec函数族就提供了一个在进程中启动另一个程序执行的 ...

  6. C#可扩展编程之MEF学习笔记(三):导出类的方法和属性

    前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下MEF是如何导出方法和属性的. 还是前面的代码,第二篇中已经提供 ...

  7. Java高性能编程之CAS与ABA及解决方法

    Java高性能编程之CAS与ABA及解决方法 前言 如果喜欢暗色调的界面或者想换换界面,可以看看我在个人博客发布的 Java高性能编程之CAS与ABA及解决方法. CAS概念 CAS,全称Compar ...

  8. 网络编程之socket

    网络编程之socket socket:在网络编程中的一个基本组件,也称套接字. 一个套接字就是socket模块中的socket类的一个实例. 套接字包括两个: 服务器套接字和客户机套接字 套接字的实例 ...

  9. C++混合编程之idlcpp教程Python篇(6)

    上一篇在这 C++混合编程之idlcpp教程Python篇(5) 第一篇在这 C++混合编程之idlcpp教程(一) 工程PythonTutorial4中加入了四个文件:PythonTutorial4 ...

随机推荐

  1. HDU 4886 TIANKENG’s restaurant(Ⅱ) hash+dfs

    题意: 1.找一个字符串s使得 s不是给定母串的子串 2.且s要最短 3.s在最短情况下字典序最小 hash.,,结果t掉了...加了个姿势怪异的hash值剪枝才过.. #include <cs ...

  2. ylbtech-LanguageSamples-UserConversions(用户定义的转换)

    ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-UserConversions(用户定义的转换) 1.A,示例(Sample) 返回顶部 ...

  3. 用于OpenRISC的Makefile示例

    #* #*********************************************************************************************** ...

  4. Spring MVC入门Demo

    1 参考http://blog.csdn.net/haishu_zheng/article/details/51490299,用第二种方法创建一个名为springmvcdemo的Maven工程. 2  ...

  5. java 图片文字识别 ocr

    最近在开发的时候需要识别图片中的一些文字,网上找了相关资料之后,发现google有一个离线的工具,以下为java使用的demo 在此之前,使用这个工具需要在本地安装OCR工具: 下面一个是一定要安装的 ...

  6. centos6.8服务器配置之编译安装PHP、配置nginx

    php version 5.6.31.nginx version: nginx/1.10.2 1.下载: wget http://cn2.php.net/distributions/php-5.6.3 ...

  7. 2017.12.25 Mybatis物理分页插件PageHelper的使用(二)

    参考来自: 官方文档的说明:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md 上篇博客 ...

  8. Solidworks如何等比例缩小放大模型

    比如初始化的模型,笔记本长度只有120mm,实际上应该是3倍左右   右击特征,勾选模具工具,然后可以发现多出来一个页面   点击比例缩放,选中要缩放的特征,设置比例,然后打钩   可以发现已经缩放到 ...

  9. 我为什么选择ANGULAR 2?

    没有选择是痛苦的,有太多的选择却更加痛苦.而后者正是目前前端领域的真实写照.新的框架层出不穷: 它难吗?它写得快吗?可维护性怎样?运行性能如何?社区如何?前景怎样?好就业吗?好招人吗?组建团队容易吗? ...

  10. 【转】linux性能相关的命令和概念

    1. top命令结果解读 23:31:27:系统时间 up 8 days: 表示从开机到现在,一共运行了8天 1 user:1个用户正在使用系统 load average:系统负载,即任务队列的平均长 ...