getopt参数解析

描述

getopt参数解析

  getopt()用来分析命令行参数。

1.短形参解析getopt

#include 
int getopt(int argc, char * const argv[],const char *optstring);
 extern char *optarg;
 extern int optind, opterr, optopt;
函数功能:短形参解析
 形 参:argc、argv main函数参数
    optstring 短形参格式。例:a: b::cv
          一个’:’表示必带参数
          两个’::’表示可带参数,带参数时第一参数必须和b之间不能有空格
          没有’:’表示可选参数
 返回值:解析成功返回短形参
     解析失败返回?
     解析完成返回-1
   全局变量:
 optarg – 保存短形参后面的第一个参数(必带参数和可带参数才能得到)
 optind – 再次调用 getopt() 时的下一个 argv 指针的索引
 opterr – 错误值信息
 optopt – 参数解析失败是返回短形参值,成功则为0
#include 
#include 
int main(int argc,char *argv[])
{
	int opt;
	int cnt;
	while(1)
	{
		opt=getopt(argc,argv,"a:b::vh");
		if(opt==-1)break;
		cnt=optind;
		switch(opt)
		{
			case 'a':
				printf("参数:%c\n",opt);
				printf("\t内容:%s\n",optarg);
				while(cnt

2.长形参解析getopt_long


#include 
int getopt_long(int argc, char * const argv[],const char *optstring,const struct option *longopts, int *longindex);
函数功能:长形参解析
形 参:argc、argv main函数参数
    optstring 短形参格式。例:a: b::cv
            一个’:’表示必带参数
            两个’::’表示可带参数,带参数时第一参数必须和b之间不能有空格
            没有’:’表示可选参数
     longopts 长形参结构体
        struct option {
            const char *name; //长形参名
            int has_arg; //参数选择标志
            int *flag; //一般填NULL
            int val; //长形参解析成功返回标志信息
            };
        has_arg:
            #define no_argument 0 //不需要参数
            #define required_argument 1 //必须指定参数
            #define optional_argument 2 //参数可选
    Longindex:解析成成功返回的长形参结构体数组下标
返回值:解析成功返回短形参
    解析失败返回?
    解析完成返回-1

  getopt_long完全兼容getopt短形参解析功能;在使用getopt_long实现长形参解析时,初始化长形参longopts时最后一个结构体成员一定要设置为全为0,否则会段错误。


#include 
#include 
struct option loqngopts[]=
{
	{"version",no_argument,NULL,'v'},//不带参数
	{"help",no_argument,NULL,'h'},//不带参数
	{"prefix=",required_argument,NULL,'p'},//必带参数
	{"a123",optional_argument,NULL,'a'},//可选参数
		{0,0,0,0}, //最后一个成员必须全为0
	
};
int main(int argc,char *argv[])
{
	int index;
	int opt;
	int cnt;
	while(1)
	{
		opt=getopt_long(argc,argv,"a:b::vh",loqngopts,&index);
		if(opt==-1)break;//解析完成
		cnt=optind;
		switch(opt)
		{
			case 'a':
				printf("index=%d\n",index);
				if(index<=sizeof(loqngopts)/sizeof(struct option))//长形参
				{
					printf("长形参:%s\n",loqngopts[index].name);
					if(optarg!=NULL)
					{
						printf("\t内容:%s\n",optarg);
					}
					while(cnt)>
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分