linux getopt_long函数,命令行参数处理-getopt()和getopt_long()

在实际编程当中,自己编写代码处理命令行参数是比较麻烦且易出错的。一般我们会直接使用getopt()和getopt_long()函数,下文将介绍具体的使用方法。

getopt()

getopt()用于处理”单字母“选项,如-a, -t等。函数声明如下:

#include

int getopt(int argc, char *const argv[], const char *optstring);

extern char *optarg;

extern int optind, opterr, optopt;

参数说明

对于前两个参数argc和grgv[],一般直接使用main()传递进来的数值。用过C语言的同学应该比较熟悉,简单复习一下。

#include

#include

int main(int argc, char const *argv[])

{

//在C99标准推出之前,变量不能在for()声明,为了兼容性,这里提前声明"i"

int i;

printf("argc = %d\n", argc);

if (argc > 1)

{

for (i = 0; i < argc; ++i)

{

printf("argv[%d] = %s\n", i, argv[i]);

}

}

return 0;

}

argc: argument count, 记录了命令行参数的个数(包括命令本身)

argv: argument vector, 记录了命令行参数的具体内容

$ ./test 1 2 3

argc = 4

argv[0] = ./test

argv[1] = 1

argv[2] = 2

argv[3] = 3

optstring: 作为getopt()的第三个参数,用于规定合法选项(option)以及选项是否带参数(argument)。一般为合法选项字母构成的字符串,如果字母后面带上冒号:就说明该选项必须有参数。如"ht:"说明有两个选项-h和-t且后者(-t)必须带有参数(如-t 60)。

返回值

option character: 一般情况下,getopt()读取到合法选项,就返回该选项(一个字母)。

-1:结束标志。

while ( (opt = getopt(argc, argv, "ab:") ) != -1) {...}

?: 一般情况下,遇到非法选项或者参数缺失都会返回?。如果需要区分这两种错误,可以在optstring的开头加上:,如:ht: , 这样参数缺失就返回:,非法选项就返回?。

::在optstring参数开头第一个字符为:时,遇到参数缺失返回:。参考下方代码(摘自Linux Programming by Example)可帮助理解

int oc; /* option character */

char *b_opt_arg;

while ((oc = getopt(argc, argv, ":ab:")) != -1) {

switch (oc) {

case 'a':

/* handle -a, set a flag, whatever */

break;

case 'b':

/* handle -b, get arg value from optarg */

b_opt_arg = optarg;

break;

case ':':

/* missing option argument 参数缺失*/

fprintf(stderr, "%s: option '-%c' requires an argument\n",

argv[0], optopt);

break;

case '?':

default:

/* invalid option 非法选项*/

fprintf(stderr, "%s: option '-%c' is invalid: ignored\n",

argv[0], optopt);

break;

}

}

相关变量

optind(option index): 数组下标,指向下一个未处理的参数。通过例子(摘自stackoverflow)能更好理解:

#include

#include

#include

int main(int argc, char *argv[])

{

char optStr[] = "ab";

int c;

while ((c = getopt(argc, argv, optStr)) != -1) {

printf("optind: %d\n", optind);

switch (c) {

case 'a':

printf("-a\n");

break;

case 'b':

printf("-b\n");

break;

case '?':

printf("error\n");

break;

}

}

return 0;

}

测试结果:

$ ./a.out -ab #例子1

optind: 1

-a

optind: 2

-b

$ ./a.out -a #例子2

optind: 2

-a

例子1:

#argv[]数据如下

argv[0]="./a.out"

argv[1]="-ab"

argv[2]=0

从optind=1开始,处理完a,optind指向b所在位置,其实还是1;处理完b,指向下一个选项,即2

例子2:

#argv[]数据如下

argv[0]="./a.out"

argv[1]="-a"

argv[2]=0

从optind=1开始,处理完a,指向下一个选项,即2

optarg: 如果合法选项带有参数,那么对应的参数,赋值给optarg

getopt_long()

根据函数名就可以知道getopt_long()用于处理长选项,如-help。函数声明如下:

#include

int getopt_long(int argc, char *const argv[], const char *optstring, const struct option *longopts, int *longindex);

参数说明

前三个选项和getopt()完全相同,在此不再赘述。

longopts数组: 用于规定合法长选项以及长选项是否带参数(argument)。涉及到的option结构体声明如下

struct option {

const char *name;

int has_arg;

int *flag;

int val;

};

name: 长选项的名称

has_arg: 参数情况

符号常量

数值

Meaning

no_argument

0

无参数

required_argument

1

有参数

optional_argument

2

参数可选

考虑到“可读性”,一般使用“符号常量”

int *flag: 如果flag为 NULL, getup_long() 返回val的值; 如果不是NULL, val的值赋给flag指针指向的内容,同时getopt_long()返回 0

int val: flag为NULL,val作为getopt_long()的返回值;如果flag不为NULL,val赋值给flag指针所指内容;

int *flag

return value

NULL

val

&name(

0

通过例子(摘自webbench)可加深理解

static const struct option long_options[]=

{

{"force",no_argument,&force,1}, //-force 参数三(flag)不为NULL,force=1,getopt_long()返回0

{"reload",no_argument,&force_reload,1},

{"time",required_argument,NULL,'t'},

{"help",no_argument,NULL,'?'}, //-help 第三个参数(flag)为NULL,直接返回 "?"

{"http09",no_argument,NULL,'9'},

{"http10",no_argument,NULL,'1'},

{"http11",no_argument,NULL,'2'},

{"get",no_argument,&method,METHOD_GET},

{"head",no_argument,&method,METHOD_HEAD},

{"options",no_argument,&method,METHOD_OPTIONS},

{"trace",no_argument,&method,METHOD_TRACE},

{"version",no_argument,NULL,'V'},

{"proxy",required_argument,NULL,'p'},

{"clients",required_argument,NULL,'c'},

{NULL,0,NULL,0} //最后一个元素应该全为0

};

int main(int argc, char *argv[])

{

int options_index=0;

...

while((opt=getopt_long(argc,argv,"912Vfrt:p:c:?h",long_options,&options_index))!=EOF )

{

...

}

}

注意: longopts数组的最后一个元素应该全为0.

longindex: 一般设置为NULL; 如果不为NUll, 指向每次找到的长选项在longopts的位置,可以通过该值(即索引)找到当前长选项的具体信息。

希望本文能帮助大家更好地理解getopt() 和getopt_long()。

更多的相关用法可以参考Linux Programming by Example: The Fundamentals

命令行参数解析函数getopt和getopt&lowbar;long函数【转】

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值