以前写程序不愿意用getopt这个函数,自己写代码处理命令行,处理当然不够好,不用getopt的原因其实是觉得这个函数有点绕,也是懒得学。
最近有时间就专门看了下这个函数介绍,其实基本搞懂了之后还是好用的,至少比自己处理命令行参数强。
先给出这个函数的原型:
#include
int getopt(int argc, char * const argv[],const char *optstring);
该函数还会用到几个全局变量:
extern char *optarg;
extern int optind, opterr, optopt;
首先这个函数的功能是分析命令行的参数,命令行的参数的作用是什么呢?是对程序的指示和输入一些参数供其使用。
下面看看介绍下它的参数
argc和argv就不说了,它们就是main函数的两个参数,optstring这个指针用来指向程序支持的选项集合,如:
getopt(argc,argv,"c:hf")//表示合法的选项有chf,其中选项c后面跟有:,表示选项c需要参数,而选项h和f则不需要参数。
个人认为可将getopt的功能分为两部分:区分选项和参数 、处理选项错误
一、区分选项和参数
对于选项需要以-字符开始,如 ./testopt -c 123 -f -h
每次调用getopt函数就会返回一个选项字符,同时optind赋值为下一个需要处理的字符串的索引。当选项字符扫描完后再调用就会返回-1。
optarg用于指向,当前getopt返回的那个选项字符的参数,对于./testopt -c 123 -f -h来说,第一次调用getopt会返回字符c,同时
optarg指向字符串123,而第二次调用时getopt返回选项字符f,optarg为NULL,第三次调用同第二次。
getopt对参数的区分并没有那么万能,如./testopt -c 123 -f -h 变为./testopt -fhc123(参数和选项间可以没有空格), 我们多次调用getopt时是可 以正确却区分出选项chf和参数123 的,但是换成这样:./testopt -cfh123 结果就是认为fh123都是选项c的参数。
因此:当把多个选项写在一起时(如-fhc123),把必须接参数的选项写在最后面,而存在多个必须接参数的选项时就把这些选项分开写。
另外,当多次调用getopt结束时,也就是返回-1时,会把argv的参数重新排列,选项全部排在前面,参数排在后面,而且此时optind是第一个参数
的索引。
二、处理选项错误
1、存在不支持的选项
当扫描发现非法选项时getopt就会返回?,同时会把optopt赋值为那个非法的选项字符。
2、必须接参数的选项没有接参数
扫描发现必须接参数的选项没有接参数,也会返回?把optopt赋值为那个选项字符。
另外,漏加参数时返回?是默认的,也可以配置,如getopt(argc,argv,":c:hf"),最后一个参数的最前面是个:,它的意思就是当出错时返回: 而不是?但是,这只适用于漏加参数的错误情形,对于非法选项的错误还是返回?。
全局变量opterr也是用于出错处理的,当opterr非0时会把出错信息打印在stderr上,为0则不会打印,默认是非0,自己可以置为0打印自己的提示 信息。
阅读(2114) | 评论(0) | 转发(0) |