C语⾔中使⽤库函数解析命令⾏参数
在编写需要命令⾏参数的C程序的时候,往往我们需要先解析命令⾏参数,然后根据这些参数来启动我们的程序。
C的库函数中提供了两个函数可以⽤来帮助我们解析命令⾏参数:getopt、getopt_long。
getopt可以解析短参数,所谓短参数就是指选项前只有⼀个“-”(如-t),⽽getopt_long则⽀持短参数跟长参数(如"--prefix")。
getopt函数
#include<unistd.h>
int getopt(int argc,char * const argv[],const char *optstring);
extern char *optarg;  //当前选项参数字串(如果有)
extern int optind;    //argv的当前索引值
各参数的意义:
argc:通常为main函数中的argc
argv:通常为main函数中的argv
optstring:⽤来指定选项的内容(如:"ab:c"),它由多个部分组成,表⽰的意义分别为:
1.单个字符,表⽰选项。
2 单个字符后接⼀个冒号:表⽰该选项后必须跟⼀个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。
3 单个字符后跟两个冒号,表⽰该选项后可以跟⼀个参数,也可以不跟。如果跟⼀个参数,参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。
调⽤该函数将返回解析到的当前选项,该选项的参数将赋给optarg,如果该选项没有参数,则optarg为NULL。下⾯将演⽰该函数的⽤法
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <string.h>
4
5int main(int argc,char *argv[])
6 {
7int opt=0;
8int a=0;
9int b=0;
10char s[50];
11while((opt=getopt(argc,argv,"ab:"))!=-1)
12    {
13switch(opt)
14        {
15case'a':a=1;break;
16case'b':b=1;strcpy(s,optarg);break;
17        }
18    }
19if(a)
20        printf("option a\n");
21if(b)
22        printf("option b:%s\n",s);
23return0;
24 }
View Code
编译之后可以如下调⽤该程序
getopt_long函数
与getopt不同的是,getopt_long还⽀持长参数。
#include <getopt.h>
int getopt_long(int argc, char * const argv[],const char *optstring,const struct option *longopts, int *longindex);
前⾯三个参数跟getopt函数⼀样(解析到短参数时返回值跟getopt⼀样),⽽长参数的解析则与longopts参数相关,该参数使⽤如下的结构struct option {
  //长参数名
  const char *name;
  /*c语言struct用法例子
    表⽰参数的个数
    no_argument(或者0),表⽰该选项后⾯不跟参数值
    required_argument(或者1),表⽰该选项后⾯⼀定跟⼀个参数
    optional_argument(或者2),表⽰该选项后⾯的参数可选
  */
  int has_arg;
  //如果flag为NULL,则函数会返回下⾯val参数的值,否则返回0,并将val值赋予赋予flag所指向的内存
  int *flag;
  //配合flag来决定返回值
  int val;
};
参数longindex,表⽰当前长参数在longopts中的索引值,如果不需要可以置为NULL。
下⾯是使⽤该函数的⼀个例⼦
1 #include <stdio.h>
2 #include <string.h>
3 #include <getopt.h>
4
5int learn=0;
6static const struct option long_option[]={
7    {"name",required_argument,NULL,'n'},
8    {"learn",no_argument,&learn,1},
9    {NULL,0,NULL,0}
10 };
11
12int main(int argc,char *argv[])
13 {
14int opt=0;
15while((opt=getopt_long(argc,argv,"n:l",long_option,NULL))!=-1)
16    {
17switch(opt)
18        {
19case0:break;
20case'n':printf("name:%s ",optarg);
21        }
22    }
23if(learn)
24        printf("learning\n");
25 }
View Code
编译之后可以如下调⽤该程序

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。