getopt_long的意义

    getopt_long函数主要做为命令行的处理,作用在unix和linux下。

    几乎所有的GNU/Linux程序都遵循一些同样的命令行解释习惯,程序的参数通常分为了两大类:选项(option)或者一些标志(flag)、其他参数。选项(option)主要是提供给程序一些运行上的选择,而其他参数则通常是提供给程序运行的输入之类的值。按照习惯,选项通常有两种表达形式:

    (1) 短形式:通常是由一个“-”加上一个字母组合而成。这种形式的好处是输入快捷。(2)长形式:通常是由两个“-”加上一个单词组合而成。这种形式的好处是形象、好记、直观。

    通常来说,一个程序读于这两种形式都支持。例如大多数的程序都有这样的调用选项:“-h”和“――help”。一些选项需要知道后面跟着的参数,例如“ls –s /”,这里其中的“/”就是一个参数。

    getopt_long这个函数就能够同时“理解”长形式和短形式的参数。但是要包括头文件

    #define _GNU_SOURCE
    #include <getopt.h> 。

    一个实例:
  
    假设我们要编写的一个程序需要处理以下几个参数:
  
    短形式 长形式                   含义
    -h ――help              打印帮助信息
    -s ――server           服务器IP地址
    -b ――background   后台执行

 要使用getopt_long()这个函数,我们需要提供两个数据结构,第一个是一个字符串,该字符串中的每个字符来表示短形式的选项,如果某个选项后面需要跟一个参数,那么就需要在这个字符后面加上一个“:”(冒号),例如“hs:b”就是我们这个例子中的结构。为了定义长形式表达的选项,我们需要定一个结构体数组:数组的每一项与一个长形式的参数相关,每项包括“四个参数”:通常来说,第一项是长形式的选项的字符串表达;第二项与后面是否有参数提取有关,如果后面有参数需要处理就是1,否则是0;第三项是NULL;最后一项则是与长形式相关联的短形式表达的字符。另外,这个数组的最后一项必须全部置为0。 
    根据上面的说明,对于我们的例子,可以得到下面的一个数组:
 
const struct option long_options [] =={
  {“help ”,0,NULL,‘h ’ }},
  {“server ”,1,NULL,‘s ’ }},
  {“background”,0,NULL,‘b ’ }},
  {NULL,0,NULL,0 }
  }; 
    我们把传给main函数的参数给getopt_long,他就一项一项的读取处理,返回短形式表达的选项的字符,如果没有找到选项则返回-1。通常我们都是在一个循环里面反复调用getopt_long,然后通过一个switch语句来处理不同的选项。如果getopt_long遇到一个没有定义的选项,则会返回一个“?”(问号)字符。

    #define _GNU_SOURCE
    #include <getopt.h> 

    const char*program_name;
 void print_usage (FILE*stream,int exit_code)
 {
  fprintf (stream,“Usage:%s options [ inputfile ....] ”,program_name);
  fprintf (stream, “ -h --help Display this usage information. ”
  “ -s --server ip Set the server IP. ”
  “ -b --background run in the backgound. ”);
  exit (exit_code);
 }
 int main (int argc,char*argv [])
 {
  int next_option;
  const char*const short_options =“hs:b ”;
  const struct option long_options [] =={
  {“help ”,0,NULL,‘h ’ }},
  {“server”,1,NULL,‘s ’ }},
  {“background ”,0,NULL,‘b ’ }},
  {NULL,0,NULL,0 }
  };
  const char*output_filename =NULL;
  int verbose =0;
  program_name =argv [0 ];
  do {
       next_option =getopt_long (argc,argv,short_options,  long_options,NULL);
       switch (next_option)
       {  
       case ‘h ’:/*-h or --help */
            print_usage (stdout,0);
       case ‘s ’:/*-o or --output */
            //ip =optarg;
           break;
       case ‘b ’:/*-v or --verbose */
           break;
       case ‘?’:/*The user specified an invalid option.*/
           code one (indicating abnormal termination).*/
           print_usage (stderr,1);
       case -1:/*Done with options.*/
           break;
       default:/*Something else:unexpected.*/
           abort ();
       }
  }
  while (next_option !=-1);
  /*The main program goes here.*/
  return 0;
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值