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); }
时间: 2024-11-05 20:27:59