Chinaunix首页 | 论坛 | 博客
  • 博客访问: 69825
  • 博文数量: 11
  • 博客积分: 610
  • 博客等级: 中士
  • 技术积分: 135
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-08 14:33
文章分类
文章存档

2012年(3)

2011年(1)

2010年(3)

2008年(4)

我的朋友

分类: LINUX

2008-04-18 11:36:37

在实际程序之中我们经常要对命令行参数进行分析. 比如我们有一个程序 a 可以接受许多参数.一个可能的情况是:
 
a -d print --option1 hello --option2 world
 
那么我们如何对这个命令的参数进行分析? 经常用的函数是 getopt 和 getopt_long.
 

#include <unistd.h>
#include <getopt.h>


int getopt(int argc,char const **argv, const char *optstring);
int getopt_long(int argc,char const **argc, const char *optstring,const struct option *longopts, int *longindex);

extern char *optarg;
extern int optind, opterr, optopt;

struct option {
 char *name;
 int has_flag;
 int *flag;
 int value;
};

 
getopt_long 是 getopt 的扩展. getopt 接受的命令行参数只可以是以(-)开头,
而 getopt_long 还可以接受(--)开头的参数. 一般以(-)开头的参数的标志只有一个字母,
而以(--)开头的参数可以是一个字符串. 如上面的 -d,--option1 选项.
 
argc 和 argv 参数是 main() 函数的参数. optstring 指出了我们可以接受的参数. 其一般的形式为: 参数1[:]参数2[:].... 其中参数是我们可以接受的参数, 如果后面的冒号没有省略, 那么表示这个参数出现时后面必需要带参数值. 比如一个 optstring 为 abc:d: 表示这个参数选项可以为 a, b, c, d 其中 c, d 出现时候必须要有参数值. 如果我们输入了一个我们没有提供的参数选项, 系统将会说不认识的选项. getopt 返回我们指定的参数选项, 同时将参数值保存在 optarg 中, 如果已经分析完成所有的参数函数返回 -1.这个时候 optind 指出非可选参数的开始位置.
 

#include <stdio.h>
#include <unistd.h>
int main(int argc,char **argv)
{
 int is_a,is_b,is_c,is_d,i;
 char *a_value,*b_value,*c_value,temp;
 is_a=is_b=is_c=is_d=0;
 a_value=b_value=c_value=NULL;
 if(argc==1)
 {
  fprintf(stderr,"Usage:%s [-a value] [-b value] [-c value] [-d] arglist ...\n",
  argv[0]);
  exit(1);
 }
 while((temp=getopt(argc,argv,"a:b:c:d"))!=-1)
 {
  switch (temp)
  {
   case @#a@#:
    is_a=1;
    a_value=optarg;
    break;
   case @#b@#:
    is_b=1;
    b_value=optarg;
    break;
   case @#c@#:
    is_c=1;
    c_value=optarg;
    break;
   case @#d@#:
    is_d=1;
    break;
  }
 }
 printf("Option has a:%s with value:%s\n",is_a?"YES":"NO",a_value);
 printf("Option has b:%s with value:%s\n",is_b?"YES":"NO",b_value);
 printf("Option has c:%s with value:%s\n",is_c?"YES":"NO",c_value);
 printf("OPtion has d:%s\n",is_d?"YES":"NO");
 i=optind;
 
 while(argv[i]) printf(" with arg:%s\n",argv[i++]);
 exit(0);
}

 
getopt_long 比 getopt 复杂一点, 不过用途要比 getopt 广泛.
struct option 指出我们可以接受的附加参数选项.
name 指出长选项的名称(如我们的 option1 )
has_flag 为 0 时表示没有参数值, 当为 1 的时候表明这个参数选项要接受一个参数值. 为 2 时表示参数值可以有也可以没有. 指出函数的返回值. 如果为NULL, 那么返回 val, 否则返回 0, 并将 longindex 赋值为选项所在数组(longopts)的位置.
 

/* 这个实例是从 GNU Libc 手册上看到的 */
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
int main (int argc, char **argv)
{
 int c;
 while (1)
 {
  struct option long_options[] =
  {
   {"add", 1, 0, 0},
   {"append", 0, 0, 0},
   {"delete", 1, 0, 0},
   /* 返回字符c,等同于 -c 选项 */
   {"create", 0, 0, @#c@#},
   {"file", 1, 0, 0},
   /* 数组结束 */
   {0, 0, 0, 0}
  };
  /* getopt_long stores the option index here. */
  int option_index = 0;
  c = getopt_long (argc, argv, "abc:d:",
  long_options, &option_index);
  /* Detect the end of the options. */
  if (c == -1)
   break;
  switch (c)
  {
   case 0:
    printf ("option %s", long_options[option_index].name);
    if (optarg)
    printf (" with arg %s\n", optarg);
    break;
   case @#a@#:
    puts ("option -a\n");
    break;
   case @#b@#:
    puts ("option -b\n");
    break;
   /* 可能是-c --creat参数指出来的 */
   case @#c@#:
    printf ("option -c with value `%s@#\n", optarg);
    break;
   case @#d@#:
    printf ("option -d with value `%s@#\n", optarg);
    break;
  }
 }
 exit (0);
}

 
当我们输入了错误的选项后, 系统会给出错误的提示, 如果我们想屏蔽这个信息, 我们可以设置 opterr 为 0, 对于错误的选项, 函数分析时候返回一个@#?@#字符. 我们可以自己对这个字符进行处理.
阅读(684) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~