续getopt函数 谈自己对getopt_long看法

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

好东西。值得一用。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值