初识解析参数的getopt函数


linux中有个函数可以用来解析传递给main函数的参数,就是getopt函数,用这个函数就可以不需要自己再写一个参数解析函数了...很省事。

定义如下:

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

所需参数argc,argv就是main函数中传入的参数,关于optstring参数是这样的,我用下面一个例子来说明吧:

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 5 main(int argc, char ** argv) 6 { 7 int opt; 8 9 while ((opt = getopt(argc, argv, "a:b:")) != -1) 10 { 11 switch (opt) 12 { 13 case 'a': printf("a\t%x\n", optarg); 14 break; 15 case 'b': printf("b\t%x\n", optarg); 16 break; 17 } 18 } 19 printf("%x\t%x\n", argv[2], argv[4]); 20 }

可以看到,optstring参数的位置是一个字符串,但是为什么字符串里会有“a:b:”这么奇怪的字符呢?再往下看,switch(opt)中有
case a:和case b:是不是说a和b是我们要传入的参数呢?那么:又是什么东西?还有opt是getopt的返回值,从上面对opt的用法,opt是
否返回了对应的ASCII码呢?那个optarg又是什么?

呵呵,带着这些疑问来看看下面实验的结果:

[yangfan@My--Zone test]$ ./a.out -c ./a.out: invalid option -- 'c' 0 bfaa713a

结果中出现了 invalid option -- 'c'这样的提示,下面的两个数字先不用管。提示说无效的选项。再看个例子:

[yangfan@My--Zone test]$ ./a.out -a ./a.out: option requires an argument -- 'a' 0 bfa8113a

说是这个操作需要一个argument。先别急,再来个:

[yangfan@My--Zone test]$ ./a.out -a ppp a bf84212b bf84212b bf84212f


诶~~这次没有出错的提示信息了...
其实,从上面的例子就可以解决刚才所提出的问题:字符串中的ab表示a和b都是参数,所以刚才用-c参数就会提示无效的操作。:是说该参数后面是要有内容的,所以之用-a参数就会提示操作需要argument(这里翻译为“内容提要”),当使用-a ppp就正确了。对于getopt的返回值确实是对应参数的ASCII码。
哪个optarg又是什么呢?这个其实是一个参数内容的指针,它是个全局变量定义在getopt.c中,在getopt.h中有extern char *optarg;
这样的引用,而getopt.h有包含在unistd.h中,
在你的程序里面直接对其进行调用即可。下面对argv[2]和argv[4]地址的打印就是
为了验证optarg的数值是否存的是argv中的地址,结果是肯定的。结果就是这样....还有一些高端的用法,等用到了在做总结。


本文来自:http://blog.163.com/yangfan876@126/blog/static/8061245620134217536708/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值