续getopt函数 谈自己对getopt_long看法

来源:互联网 发布:java基础课程 精易 编辑:程序博客网 时间:2024/05/22 08:10
上次说到在getopt函数下对单个字符选项下的参数处理,但是有个局限性,其不能够处理多字符组合的选项。而函数getopt则能够处理这中情况。
其头文件于  <getopt——long>
函数定义  int getopt_long(int argc, char * const argv[], const char *optstring, const struct opt​​ion *longopts, int *longindex);


前三个函数的参数就不用说了(上一篇getopt中我们已经讲到),而对于处理长字符串的选项,个人感觉其就是对getopt的一种扩展而已,其机制是相同的,。
来解释下后两个参数的意义吧。
const struct option *longopts 所指的是所定义的结构体。其结构体的内容为:


struct option{const char *name; //自己所定义的长选项型的选项名int has_arg;      //这变量是用来规定其选项参数的有无性,其下有三个宏,no_argument: 其为0,表示为选项后面不加参数。    required_argument:其为1,表示这个选项后必须有参数。    optional_argument:其为2,表示这个选项其后可以跟参数,也可以不跟。这三个宏不是必须用到,可以用其所代表的数字来将其代替。int *flag;  //用来与下面的val这个变量配合,从而决定函数的返回值int val;  //与flag配合得出返回值}


函数返回值情况:(由flag与val相互决定)
1) flag为NULL,val值用于确定該长选项,所以需要为长选项指定唯一的val值。 这里也为长选项和短选项建立了桥梁。


(2) flag不为NULL,则将val值存放到flag所指向的存储空間,用与标识长选购出现过。



这里出现了个长选项与短选项这两种说法


短选项: 顾名思义,就是短小参数。它们通常包含一个连字号和一个字母(大写或小写字母)。例如:-s,-h等。


长选项: 包含了两个连字号和一些大小写字母组成的单词。例如,--size,--help等。


而 int *longindex这个参数同住用于对程序中错误的跟踪,在调试时被用的到。一般我们在写程序是常对赋值为NULL;


下面上段测试的小代码


#include <unistd.h>#include <assert.h>#include <stdio.h>#include <stdlib.h>#include <getopt.h>int main(int argc, char *argv[]){int c;char* const short_options = "wzj";struct option long_options[] ={{ "xiyou", 0, NULL, 'x' },{ "linux", 2, NULL, 'l' },{ "group", 1, NULL, 'g' },{ 0, 0, 0, 0},};while((c = getopt_long (argc, argv, short_options, long_options, NULL)) != -1){switch (c){case 'x':printf("xiyou ");break;case 'l':printf("linux ");break;case 'g':printf("group %s ", optarg);break;case 'w':printf("fight");break;case 'z':printf("ing");break;case 'j':printf("!!!\n");break;}}return 0;}


编译:gcc _getopt_long.c -o _getopt_long
执行:./_getopt_long --xiyou --linux --group ! -w -z -j


结果为:
xiyou linux group ! fighting!!!


测试成功


getopt函数的扩展getopt_long,能够同时对长选项与短选项进行处理。

好东西。值得一用。



原创粉丝点击