int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex); extern char *optarg;//选项参数保存 extern int optind, opterr, optopt;
我们先看看用于分析短参数的getopt函数。参数含义如下:
argc, argv是从main函数获取的参数,原样传给getopt;
optstring指示如何分析参数。
关于optstring,还有几点说明:
该函数每解析完一个选项,就返回该选项字符。
如果选项带参数,参数保存在optarg中。如果选项带可选参数,而实际无参数时,optarg为NULL。
当遇到一个不在optstring指明的选项时,返回字符‘?’。如果在optstring指明某选项带参数而实际没有参数时,返回字符‘?’或者字符‘:’,视optstring的第一个字符而定。这两种情况选项的实际值被保存在optopt中。
当解析错误时,如果opterr为1则自动打印一条错误消息(默认),否则不打印。
当解析完成时,返回-1。
每当解析完一个argv,optind就会递增。如果遇到无选项参数,optopt默认会把该参数调后一位,接着解析下一个参数。如果解析完成后还有无选项的参数,则optind指示的是第一个无选项参数在argv中的索引。
函数getopt_long()的工作方式类似于getopt(),不过它还能接收长选项。在接收长选项之前,我们必须定义个一个结构体数组变量longopts,指明我们希望获取的长选项。
struct option { const char *name; int has_arg; int *flag; int val; };
含义如下:
option数组的最后一个元素必须全部填充0.
getopt_long的最后一个参数longindex在函数返回时指向被搜索到的选项在longopts数组中的下标。longindex可以为NULL,表明不需要返回这个值。
getopt_long_only类似于getopt_long,但是它把'-'开头的选项当作长选项来处理。如果该选项与长选项不匹配,而与短选项匹配,则可以作为短选项解析。
在短选项找到的时候,getopt_long和getopt_long_only的表现和getopt一样。如果长选项找到了,如果flag为NULL,返回val,否则返回0。错误情况的处理和getopt一样,只是返回'?'时还可能是别的情况引起的:选项含糊不明确或者无关参数。
程序例子:
#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; while (1) { int this_option_optind = optind ? optind : 1; int option_index = 0; static struct option long_options[] = { {"add", 0, 0, 'a'}, {"bench", 0, 0, 'b'}, {"create", 1, 0, 'c'}, {"delete", 1, 0, 'd'}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "abc:d:",long_options, &option_index); if (c == -1) break; switch (c) { 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; default: printf (" getopt returned character code%s\n", c); } printf("optind:%d\n",optind); } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s", argv[optind++]); printf ("\n"); } exit (0); }
[jz@localhost ~]$ ./a.out -a --add -b --bench -c cp1 --create cp2 -d dp2 --delete dp2 option a optind:2 option a optind:3 option b optind:4 option b optind:5 option c with value ‘cp1’ optind:7 option c with value ‘cp2’ optind:9 option d with value ‘dp2’ optind:11 option d with value ‘dp2’ optind:13 [jz@localhost ~]$
参考:
http://blog.csdn.net/zhoujunyi/article/details/1577256