续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 option *longopts, int *longindex);
前三个函数的参数就不用说了(上一篇getopt中我们已经讲到),而对于处理长字符串的选项,个人感觉其就是对getopt的一种扩展而已,其机制是相同的,。
来解释下后两个参数的意义吧。
const struct option *longopts 所指的是所定义的结构体。其结构体的内容为:
函数返回值情况:(由flag与val相互决定)
(1) flag为NULL,val值用于确定該长选项,所以需要为长选项指定唯一的val值。 这里也为长选项和短选项建立了桥梁。
(2) flag不为NULL,则将val值存放到flag所指向的存储空間,用与标识长选购出现过。
这里出现了个长选项与短选项这两种说法
短选项: 顾名思义,就是短小参数。它们通常包含一个连字号和一个字母(大写或小写字母)。例如:-s,-h等。
长选项: 包含了两个连字号和一些大小写字母组成的单词。例如,--size,--help等。
而 int *longindex这个参数同住用于对程序中错误的跟踪,在调试时被用的到。一般我们在写程序是常对赋值为NULL;
其头文件于 <getopt——long>
函数定义 int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *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,能够同时对长选项与短选项进行处理。
好东西。值得一用。
- 续getopt函数 谈自己对getopt_long看法
- getopt 函数 getopt_long函数
- getopt和getopt_long函数
- getopt,getopt_long函数详解
- getopt和getopt_long函数
- getopt和getopt_long函数
- getopt和getopt_long函数
- getopt和getopt_long函数
- getopt和getopt_long函数
- getopt和getopt_long函数
- getopt和getopt_long函数
- getopt和getopt_long函数
- getopt和getopt_long函数
- getopt和getopt_long函数
- getopt和getopt_long函数
- getopt和getopt_long函数
- getopt和getopt_long函数
- getopt和getopt_long函数
- 利用组函数得出最后创建的记录
- matlab eval函数用法
- 利用ActivityGroup实现Tab分页标签
- java设计模式---访问者模式
- libtool的作用及应用
- 续getopt函数 谈自己对getopt_long看法
- poj 4604 Deque-----2013多校联合赛第一场--1005
- 将DatagridView中的数据完美导出到Excel
- 【地图投影】墨卡托投影(一)
- POJ 1753题解
- C#中New关键字的三种用法
- CSRF 攻击
- STM32 EOC标志有问题,while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET)
- 一网打尽当下NoSQL类型、适用场景及使用公司