getopt学习
【getopt学习】通常 Linux 下的各种命令都有许多的命令行参数可以选择,比如: gcc -g -lm foo.c -o foo getopt()就是用来分析命令行参数的函数。在继续讨论getopt 之前,先要明确两个概念:选项(option) 和 选项参数(argument)。在上面的例子中,-g 中的 g,-o 中的 o 还有 -lm 中的 l 就是选项,而 -lm 中的 m 就是 l 的选项参数,-o foo 中的 foo 就是 o 的选项参数。因此,我们知道了选项有两种,一种是带选项参数的,另一中是不带选项参数的。下面我们就可以继续讨论 getopt() 了。 首先是函数声明: #include extern char *optarg;
extern int optind;
extern int optopt;
extern int opterr;
extern int optreset;
int getopt(int argc, char * const *argv, const char *optstring);
getopt()每调用一次返回一个选项。 argc 和 argv 很显然就是 main 函数的两个参数。字符串 optstring 可以包含下列元素:单个字符,字符后面接一个冒号说明后面跟随一个选项参数,字符后面接两个冒号说明后面跟随一个可有可无的选项参数。例如,一个选项字符 "x" 表示选项 "-x" ,选项字符 "x:" 表示选项和其参数 "-x argument",选项字符 "x::" 表示选项 x 的参数是可选的(“::” 是 GNU 增加的,不一定在所有的UNIX 系统下都可以使用)。 getopt()的返回后,如果有选项参数的话 optarg 指向选项参数,并且变量 optind 包含下一个 argv 参数作为对 getopt() 下一次调用的索引。变量 optopt 保存最后一个由 getopt() 返回的已知的选项。当参数列已经到结尾时getopt()函数返回-1,当遇到一个未知的选项时 getopt 返回'?'。参数列中选项的解释可能会被'--'取消,由于它引起 getopt()给参数处理发送结束信号并返回-1。比如: ./getopt -a -- -c -b foo getopt 的源代码在下面,getopt 将只会解释到 -a。下面是一个最简单的例子: /* getopt.c */ #include #include int main(int argc, char * argv[]) { int aflag=0, bflag=0, cflag=0;
int ch;
// opterr = 0;
while ((ch = getopt(argc, argv, "ab:c")) != -1) { printf("optind: %d/n", optind);
switch (ch) { case 'a': printf("HAVE option: -a");
aflag = 1;
break;
case 'b': printf("HAVE option: -b");
bflag = 1;
printf("The argument of -b is %s/n", optarg);
break;
case 'c': printf("HAVE option: -c");
cflag = 1;
break;
case '?': printf("Unknown option: %c/n",(char)optopt);
break;
} } } 程序很简单,在此就不作解释了。变量opterr和optind都被初始化为1。如果想要略去命令行的前几个参数,可以在调用getopt()前将optind设成其他值。如果不希望getopt()输出出错信息,将全域变量 opterr 设为 0 即可。 GNU Linux 中对 getopt 做了相应的扩展,提供了对长参数,例如 “--help” 的支持。主要是提供了 getopt_long 函数,现在我还没有完全学会,等学会了后再来些一篇短文介绍它。
推荐阅读
- 宽容谁
- 我要做大厨
- 增长黑客的海盗法则
- 画画吗()
- 2019-02-13——今天谈梦想()
- 远去的风筝
- 三十年后的广场舞大爷
- 叙述作文
- 20190302|20190302 复盘翻盘
- 学无止境,人生还很长