getopt(分析命令行参数)


getopt(分析命令行参数) 
 
相关函数  
 
表头文件  #include<unistd.h>
 
定义函数  int getopt(int argc,char * const argv[ ],const char * optstring);
 
函数说明  getopt()用来分析命令行参数。参数argc和argv是由main()传递的参数个数和内容。参数optstring 则代表欲处理的选项字符串。此函数会返回在argv 中下一个的选项字母,此字母会对应参数optstring 中的字母。如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量optarg 即会指向此额外参数。如果getopt()找不到符合的参数则会印出错信息,并将全域变量optopt设为“?”字符,如果不希望getopt()印出错信息,则只要将全域变量opterr设为0即可。
 
返回值  如果找到符合的参数则返回此参数字母,如果参数不包含在参数optstring 的选项字母则返回“?”字符,分析结束则返回-1。
 
范例  #include<stdio.h>
#include<unistd.h>
int main(int argc,char **argv)
{
int ch;
opterr = 0;
while((ch = getopt(argc,argv,”a:bcde”))!= -1)
switch(ch)
{
case ‘a’:
printf(“option a:’%s’/n”,optarg);
break;
case ‘b’:
printf(“option b :b/n”);
break;
default:
printf(“other option :%c/n”,ch);
}
printf(“optopt +%c/n”,optopt);
}
 
执行  $./getopt –b
option b:b
$./getopt –c
other option:c
$./getopt –a
other option :?
$./getopt –a12345
option a:’12345’

/* 自己写的测试 代码 */
#include<string.h>
#include<stdio.h>
#include<unistd.h>
static int opt_a=0;
static int opt_b=0;
static int opt_c=0;
static int opt_d=0;
static int opt_e=0;
static char * opt_a_arg=NULL;
static void usage()
{
        fprintf(stderr,"Usage:getopt [a arg] [b] [c] [d] [e]/n");
        exit(1);
}

int main(int argc,char **argv)
{
         int opt;
         char opts[]="a:bcde";
         opterr = 0;
         while((opt = getopt(argc,argv,opts)) != -1){
                 switch(opt)
                 {
                         case 'a':
                                 opt_a=1;
                                 opt_a_arg=strdup(optarg);
                                 break;
                         case 'b':
                                 opt_b=1;
                                 break;
                         case 'c':
                                 opt_c=1;
                                 break;
                         case 'd':
                                 opt_d=1;
                                 break;
                         case 'e':
                                 opt_e=1;
                                 break;
                         case '?':
                                 usage();
                                 break;
                 }
         }
         if(opt_a || opt_b || opt_c|| opt_d || opt_e)
         {
                 if(opt_a)
                         printf("opt a is set and arg is %s /n",opt_a_arg);
                 if(opt_b)
                         printf("opt b is set/n");
                 if(opt_c)
                         printf("opt c is set /n");
                 if(opt_d)
                         printf("opt d is set /n");
                 if(opt_e)
                         printf("opt e is set /n");
         }else
                 usage();
}

/* Glib C 的getopt源代码文件中 自带的测试的代码 */

#ifdef TEST
/* Compile with -DTEST to make an executable for use in testing
    the above definition of `getopt'.   */
int
main (int argc, char **argv)
{
   int c;
   int digit_optind = 0;
   while (1)
     {
       int this_option_optind = optind ? optind : 1;
       c = getopt (argc, argv, "abc:d:0123456789");
       if (c == -1)
         break;
       switch (c)
         {
         case '0':
         case '1':
         case '2':
         case '3':
         case '4':
         case '5':
         case '6':
         case '7':
         case '8':
         case '9':
           if (digit_optind != 0 && digit_optind != this_option_optind)
             printf ("digits occur in two different argv-elements./n");
           digit_optind = this_option_optind;
           printf ("option %c/n", c);
           break;
         case 'a':
           printf ("option a/n");
           break;
         case 'b':
           printf ("option b/n");
           break;
         case 'c':
           printf ("option c with value `%s'/n", optarg);
           break;
         case '?':
           break;
         default:
           printf ("?? getopt returned character code 0%o ??/n", c);
         }
     }
   if (optind < argc)
     {
       printf ("non-option ARGV-elements: ");
       while (optind < argc)
         printf ("%s ", argv[optind++]);
       printf ("/n");
     }
   exit (0);
}
#endif /* TEST */ 

猜你喜欢

转载自946265172.iteye.com/blog/2157749