Chinaunix首页 | 论坛 | 博客
  • 博客访问: 629136
  • 博文数量: 135
  • 博客积分: 5217
  • 博客等级: 大校
  • 技术积分: 1289
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-05 17:36
文章分类

全部博文(135)

文章存档

2016年(1)

2012年(5)

2011年(15)

2010年(63)

2009年(51)

分类: LINUX

2010-06-06 14:19:35


原型如下:

   #include <unistd.h>


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


  我们先看看用于分析短参数的getopt函数。参数含义如下:

   argc, argv: 是从main函数获取的参数,原样传给getopt;
   optstring:   指示如何分析参数。

  关于optstring,还有几点说明:

  如果选项带参数,该选项后接冒号,比如上例中optstring为"abc:d",指示c带参数,abd没有参数;

  如果选项带可选参数,该选项后接两个冒号,比如"abc::d",表明a可能有参数,也可能没有;

  如果optstring的开头字符为':',表明如果指明选项带参数,而实际命令行没有参数时,getopt返回':'而不是'?'(默认情况下返回 '?',和无法识别的参数返回一样);

  如果optstring的开头字符为'+',表明一但遇到一个无选项参数,马上停止扫描,随后的部分当作参数来解释;

  如果optstring的开头字符为'-',表明如果遇到无选项参数,则把它当作选项1(不是字符'1')的参数

  如果选项带参数,参数保存在optarg中。如果选项带可选参数,而实际无参数时,optarg为NULL。

  当遇到一个不在optstring指明的选项时,返回字符‘?’。如果在optstring指明某选项带参数而实际没有参数时,返回字符‘?’或者字 符‘:’,视optstring的第一个字符而定。这两种情况选项的实际值被保存在optopt中。


  当解析错误时,如果全局变量opterr为1则自动打印一条错误消息(默认),否则不打印。

  返回值:
     该函数每解析完一个选项,就返回该选项字符。
     -1,表示解析完成。

  每当解析完一个argv,optind就会递增。如果遇到无选项参数,getopt默认会把该参数调后一位,接着解析下一个参数。如果解析完成后还有 无选项的参数,则optind指示的是第一个无选项参数在argv中的索引。


  extern char *optarg;
  extern int optind, opterr, optopt;
  #define _GNU_SOURCE
  #include <getopt.h>

   //long
  int getopt_long(int argc, char *const argv[],
      const char *optstring,
          const struct option *longopts, int *longindex);

  int getopt_long_only(int argc, char * const argv[],
      const char *optstring,
         const struct option *longopts, int *longindex);



  函数getopt_long()的工作方式类似于getopt(),不过它还能接收长选项。在接收长选项之前,我们必须定义个一个结构体数组变量 longopts,指明我们希望获取的长选项。


  


struct option

{
    const char *name;
    int has_arg;
   int *flag;
   int val;
};


  含义如下:
  name指明长选项的名称;
  has_arg指明该选项是否带参数,1为是,0为否,2为可选;
  flag指明长选项如何返回,如果flag为NULL,则getopt_long返回val。否则返回0,flag指向一个值为val的变量。如果该长选项没有发现,flag保持不变;
  val指明返回的值,或者需要加载到被flag所指示的变量中。
  option数组的最后一个元素必须全部填充0.

  getopt_long的最后一个参数longindex在函数返回时指向被搜索到的选项在longopts数组中的下标。longindex可以为 NULL,表明不需要返回这个值。

  getopt_long_only类似于getopt_long,但是它把'-'开头的选项当作长选项来处理。如果该选项与长选项不匹配,而与短选项 匹配,则可以作为短选项解析。

  在短选项找到的时候,getopt_long和getopt_long_only的表现和getopt一样。如果长选项找到了,如果flag为 NULL,返回val,否则返回0。错误情况的处理和getopt一样,只是返回'?'时还可能是别的情况引起的:选项含糊不明确或者无关参数。


阅读(707) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~