C语言-getopt函数
#include<unistd.h> int getopt(int argc,char *const argv[],const char *optstring);
extern char *optarg;
extern int optind,opterr,optopt;
optstring为一个字符列表,每个字符代表一个单字符选项
全局变量:
optarg:存数据
optind
opterr:控制是否向STDERR打印错误。若值为0,则关闭打印错误信息
optopt:存储出错的option(如缺参数),或者不认识的option
函数说明:
getopt()用来分析命令行参数。参数argc和argv是由main()传递的参数个数和内容。参数optstring 则代表欲处理的选项字符串。此函数会返回在argv 中下一个的选项字母,此字母会对应参数optstring 中的字母。如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量optarg 即会指向此额外参数。如果getopt()找不到符合的参数则会印出错信息,并将全域变量optopt设为“?”字符,如果不希望getopt()印出错信息,则只要将全域变量opterr设为0即可。
短参数定义:
getopt()使用opstring所指的字符串作为短参数列表,像“krf:d::"就是一个短参数列表,短参数的定义是一个‘-’后面跟一个字母或数字(例如命令ls -a -l getopt()函数接受前面有"-"的参数选项"a,l",当然ls -al也接受为"a,l")
其中短参数在getopt()定义分为下面几种:
1.若optstring中有一个字符后面紧跟一个冒号“:”,则表明该选项有一个关联值作为下一个参数(含f的参数要这样写" -f filename"),若有两个冒号则代表则表示该关联值可有可无(注意:可选关联值的参数与关联值之间不能有空格,例如”-dvalue"是合法的,然而"-d value"是不合法的)
2.不带值得参数也就是说短参数列表中“r‘就不用带关联值,还有不带值的参数可以连写,”k“与“r”就是不带值的参数,在命令中可以写成"-kr" 或者"-k -r"
3.参数顺序不要求先后,例如"-kr -f opt.c -dopt"与"-f opt.c -dopt -kr"是合法的
返回值:
getopt()每次调用会逐次返回命令行传入的参数。
当没有参数的最后的一次调用时,getopt()将返回-1。
当解析到一个不在optstring里面的参数,或者一个必选值参数不带值时,返回'?',对于解析到一个不在optstring里面的参数的情况,函数会报错,输出一个错误信息,如果不想输出错误信息,设置全局变量opterr为0就行或者用下面的方法(opstring开头加个冒号":")
当optstring是以':'开头时,缺值参数也就是参数后面缺少关联值下会返回':',而不是'?' ,当然这不影响遇到解析到一个不在optstring里面的参数的情况,这种情况仍然返回'?',而且函数不会输出错误信息(不知道为什么)
好了,接下来就是测试了,先贴代码
#include<stdio.h> #include<stdlib.h> #include<unistd.h> int main(int argc,char *argv[]) { int opt; while((opt=getopt(argc,argv,":krf:d::"))!=-1) { switch(opt) { case 'k': case 'r': printf("Option %c\n",opt); break; case 'f': printf("Option %c with value %s\n",opt,optarg); break; case 'd': if(optarg!=0) { printf("Option %c ",opt); printf(" value %s\n",optarg); } else printf("Option without value %c\n",opt); break; case '?': printf("Unknown option %c\n",optopt); break; case ':': printf("-%c needs value\n",optopt); break; } } for(;optind<argc;optind++) { printf("Argument: %s\n",argv[optind]); } return 0; }
测试语句"./a.out file -kr -ddoc -f a.out -q"
文章参考:http://blog.csdn.net/an_zhenwei/article/details/7947570
http://vopit.blog.51cto.com/2400931/440453
至于optind的内容可以参考http://blog.sina.com.cn/s/blog_64ba2b750100vz5b.html