快捷搜索:   nginx

用getopt处理命令行参数(2)

  break;

  case 0:

  printf("getopt_long()设置变量 : do_name = %d\n", do_name);

  printf("getopt_long()设置变量 : do_gf_name = %d\n", do_gf_name);

  break;

  }

  }

  return 0;

  }

  在进行测试之前,再来回顾一下有关option结构中的指针flag的说明吧。

  如果这个指针为NULL,那么 getopt_long()返回该结构val字段中的数值。如果该指针不为NULL,getopt_long()会使得它所指向的变量中填入val字段中的数值,并且getopt_long()返回0。如果flag不是NULL,但未发现长选项,那么它所指向的变量的数值不变。

  下面测试一下:

  $ ./long_opt_demo --name

  getopt_long()设置变量 : do_name = 1

  getopt_long()设置变量 : do_gf_name = 0

  $ ./long_opt_demo --gf_name

  getopt_long()设置变量 : do_name = 0

  getopt_long()设置变量 : do_gf_name = 1

  $ ./long_opt_demo --love forever

  Our love is forever!

  $ ./long_opt_demo -l forever

  Our love is forever!

  测试过后,应该有所感触了。关于flag和val的讨论到此为止。下面总结一下get_long()的各种返回值的含义:

  返回值

  含 义

  0

  getopt_long()设置一个标志,它的值与option结构中的val字段的值一样

  1

  每碰到一个命令行参数,optarg都会记录它

  '?'

  无效选项

  ':'

  缺少选项参数

  'x'

  选项字符'x'

  -1

  选项解析结束

  从实用的角度来说,我们更期望每个长选项都对应一个短选项,这种情况下,在option结构中,只要将flag设置为NULL,并将val设置为长选项所对应的短选项字符即可。譬如上面清单5中的程序,修改如下。

  清单6:

  #include <stdio.h>

  #include <getopt.h>

  int do_name, do_gf_name;

  char *l_opt_arg;

  struct option longopts[] = {

  { "name",        no_argument,            NULL,                'n'    },

  { "gf_name",    no_argument,            NULL,                'g'    },

  { "love",        required_argument,    NULL,                'l'    },

  {     0,    0,    0,    0},

  };

  int main(int argc, char *argv[])

  {

  int c;

  while((c = getopt_long(argc, argv, ":l:", longopts, NULL)) != -1){

  switch (c){

  case 'n':

  printf("My name is LYR.\n");

  break;

  case 'g':

  printf("Her name is BX.\n");

  break;

  case 'l':

  l_opt_arg = optarg;

  printf("Our love is %s!\n", l_opt_arg);

  break;

  }

  }

  return 0;

  }

  测试结果如下:

  $ ./long_opt_demo --name --gf_name --love forever

  My name is LYR.

  Her name is BX.

  Our love is forever!

  $ ./long_opt_demo -ng -l forever

  My

name is LYR.

  Her name is BX.

  Our love is forever!

  9、在LINUX之外的系统平台上使用GNU getopt()或getopt_long()

  只要从GNU程序或GNU C Library(GLIBC)的CVS档案文件中copy源文件即可(http://sourceware.org/glibc/)。所需源文件是 getopt.h、getopt.c和getoptl.c,将这些文件包含在你的项目中。另外,你的项目中最好也将COPYING.LIB文件包含进去,因为GNU LGPL(GNU 程序库公共许可证)的内容全部包括在命名为COPYING.LIB 的文件中。

  10、结论

  程序需要能够快速处理各个选项和参数,且要求不会浪费开发人员的太多时间。在这一点上,无论是GUI(图形用户交互)程序还是CUI(命令行交互)程序,都是其首要任务,其区别仅在于实现方式的不同。GUI通过菜单、对话框之类的图形控件来完成交互,而CUI使用了纯文本的交互方式。在程序开发中,许多测试程序用CUI来完成是首选方案。

  getopt() 函数是一个标准库调用,可允许您使用直接的 while/switch 语句方便地逐个处理命令行参数和检测选项(带或不带附加的参数)。与其类似的 getopt_long() 允许在几乎不进行额外工作的情况下处理更具描述性的长选项,这非常受开发人员的欢迎

本文作者:未知

顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论