码迷,mamicode.com
首页 > 其他好文 > 详细

apue编程之getopt ,getopt_long使用方法以及实例

时间:2016-04-20 10:01:32      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:

1.getopt

1.1 函数定义

 

int getopt(int argc, char * const argv[], const char *optstring);
#include <unistd.h>

该函数用来解析命令行参数。前两个参数设为main函数的两个参数。optstring设为由该命令要处理的各个选项组成的字符串。选项后面带有冒号‘:‘时,该选项是一个带参数的选项。

例如:make -f filename -n
-f是一个带参数的选项,-n是一个没有参数的选项。

可以下面这样调用函数getopt来解析上面的例子。

c = getopt(argc, argv, "f:n");

  此函数的返回值即为当前找到的命令选项,全部选项都找到时的返回值为-1。通常一个命令有多个选项,为了取得所有选项,需要循环调用此函数,直到返回值为-1。
  要使用此函数,还有几个全局变量必须要了解。

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

optarg: 当前选项带参数时,optarg指向该参数。
optind: argv的索引。通常选项参数取得完毕时,通过此变量可以取得非选项参数(argv[optind])
optopt: 一个选项在argv中有,但在optstring中不存在时,或者一个带参数的选项没有参数时,
        getopt()返回‘?‘,同时将optopt设为该选项。
opterr: 将此变量设置为0,可以抑制getopt()输出错误信息。

 

1.2 实例

 1 #include <unistd.h>
 2 #include <string.h>
 3 #include <stdio.h>
 4    
 5    
 6 int main(int argc, char *argv[ ])  
 7 {
 8     int c;
 9     int flg = 0;
10     char filename[256];
11     char testdata[256];
12    
13    
14     if (argc < 2)
15     {
16         printf("usage:%s [-f filename] [-n] testdata\n", argv[0]);
17         return -1;
18     } 
19    
20    
21     opterr = 0;
22    
23    
24     while ((c = getopt(argc, argv, "f:n")) != -1)
25     {
26         switch (c)
27         {
28             case f:
29                 strncpy(filename, optarg, sizeof(filename)-1);
30    
31    
32                 break;
33             case n:
34                 flg = 1;
35    
36    
37                 break;
38             case ?:
39             default:
40                 printf("usage:%s [-f filename] [-n] testdata\n", argv[0]);
41                 return -1;
42         } 
43     } 
44    
45    
46     if (argv[optind] == NULL)
47     {
48         printf("usage:%s [-f filename] [-n] testdata\n", argv[0]);
49         return -1;
50     } 
51     else
52     {
53         strncpy(testdata, argv[optind], sizeof(testdata)-1);
54     } 
55    
56    
57     printf("fliename:%s flg:%d testdata:%s\n", filename, flg, testdata);
58    
59    
60     return 0;
61 }

 

2. getopt_long

2.1 函数定义

int getopt_long(int argc, char * const argv[],
                  const char *optstring,
                  const struct option *longopts, int *longindex);
#include <getopt.h>

这是支持长命令选项的函数,长选项以‘--‘开头。前三个参数与函数getopt的参数是一样的。只支持长选项时,参数optstring设置为NULL或者空字符串""。第四个参数是一个构造体struct option的数组。此构造体定义在头文件getopt.h中。

struct option {
const char *name;
int has_arg;
int *flag;
int val;
};
构造体各个成员的解释如下
name   : 长选项的名字
has_arg: no_argument或0表示此选项不带参数,required_argument或1表示此选项带参数,optional_argument或2表示是一个可选选项。
flag   : 设置为NULL时,getopt_long()返回val,设置为NULL以外时,getopt_long()返回0,且将*flag设为val。
val    : 返回值或者*flag的设定值。有些命令既支持长选项也支持短选项,可以通过设定此值为短选项实现。
此数组的最后一个须将成员都置为0。
第五个参数是一个输出参数,函数getopt_long()返回时,longindex的值是struct option数组的索引。

关于返回值有以下几种情况:
识别为短选项时,返回值为该短选项。
识别为长选项时,如果flag是NULL的情况下,返回val,如果flag非NULL的情况下,返回0。
所有选项解析结束时返回-1。
存在不能识别的选项或者带参数选项的参数不存在时返回‘?‘

2.2 实例

#include <stdio.h>     /* for printf */
#include <stdlib.h>    /* for exit */
#include <getopt.h>
   
int main(int argc, char **argv) 
{
   int c;
   int digit_optind = 0;
   int flag = 0;
   
   
   while (1) {
       int this_option_optind = optind ? optind : 1;
       int option_index = 0;
       static struct option long_options[] = {
           {"add",     required_argument, 0,  0 },
           {"append",  no_argument,       0,  0 },
           {"delete",  required_argument, 0,  0 },
           {"verbose", no_argument,       0,  0 },
           {"create",  required_argument, 0, c},
           {"file",    required_argument, 0, f},
           {0,         0,                 0,  0 }
       };
   
   
       c = getopt_long_only(argc, argv, "abc:d:f:012", long_options, &option_index);
       if (c == -1)
           break;
   
   
       switch (c) {
       case 0:
           printf("option %s", long_options[option_index].name);
              
           if (optarg)
               printf(" with arg %s", optarg);
   
   
           printf("\n");
           break;
   
   
       case 0:
       case 1:
       case 2:
           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 d:
           printf("option d with value ‘%s‘\n", optarg);
           break;
        case f:
            printf("option f 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(EXIT_SUCCESS);
}

 

apue编程之getopt ,getopt_long使用方法以及实例

标签:

原文地址:http://www.cnblogs.com/prettyshuang/p/5411330.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!