上次说到在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,能够同时对长选项与短选项进行处理。
好东西。值得一用。