命令行程序选项解析函数—getopt

转载请注明出处:http://blog.csdn.net/zhangyang0402/archive/2010/06/14/5671410.aspx

 

 

命令行工具下的参数选项有两种,长选项短选项。短选项以-开头,后面跟单个字母;长选项以--开头,后面可跟多个字母。

 

功能:解析命令行短选项参数

函数原型:

#include <getopt.h>

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

几个外部变量

extern char *optarg;  

extern int optind, opterr, optopt;

optarg:若短选项后有参数,则optarg指向该参数

optind:扫描选项时,标识下一个选项的索引;扫描结束后,标识第一个非选项参数索引

opterr:出现不可识别的选项时,getopt将打印错误信息。将opterr设为0,可不打印错误信息。

optopt:存放不可识别的选项至optopt

 

1. 参数

argc:参数的个数(main)

argv:参数数组(main)

optstring:短选项字符集合,如 -i -n中的i,n

 

若选项后面有参数,则选项字符后加: 对应的参数值保存在外部变量optarg

optstring "i:a",则表示程序支持两个短选项 -i arg-a, -i后面须有参数值

当执行./a.out -i filename -a时,optarg指针就指向filename

 

2. 解析过程

getopt首先扫描argv[1]argv[argc-1],并将选项及参数依次放到argv数组的最左边,非选项参数依次放到argv的最后边

如执行程序为:

     0     1   2  3  4  5  6   7  8  9 

$ ./mygetopt file1 -i infile -a -o outfile -v -h file2

 

扫描过程中,optind是下一个选项的索引, 非选项参数将跳过,同时optind1optind初始值为1。当扫描argv[1]时,为非选项参数,跳过,optind=2;扫描到-i选项时,后面有参数,下一个将要扫描的选项是-a,optind更改为4;扫描到-a选项时,下一个选项是-ooptind=5;扫描到-o选项时,后面有参数,下一个选项是-v,optind=7;扫描到-v选项时,下一个选项是-hoptind=8;扫描到-h选项时,optind=9

 

扫描结束后,getopt会将argv数组修改成下面的形式

     0    1  2  3  4  5   6  7  8   9

$./mygetopt -i infile -a -o outfile -v -h file1 file2

 

同时,optind会指向非选项的第一个参数,如上面,optind将指向file1

 

 

3. 返回值

getopt找到短选项字符,则返回该选项字符;

若出现不能接受的选项字符或丢失选项参数,则返回?,同时optopt将被设置成相应选项字符;

则后面没有选项字符,则返回-1

 

4. 测试

 mygetopt.c

执行结果:

$ ./mygetopt file1 -i infile -a -o outfile -v -h file2

option i: infile

optind=4

 

option a :a

optind=5

 

option o: outfile

optind=7

 

option v: v

optind=8

 

Usage: ./mygetopt [-i infile] [-a] [-o outfile] [-v] [-h] [file]

optind=9

 

non-option arguments below:

file1

file2    

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值