命令行参数解析:getopt,getopt_long
#include <unistd.h> int getopt(int argc, char * const argv[], const char *optstring); extern char *optarg; /* 当前选项对应的参数,or NULL */ extern int optind, opterr, optopt; /* optind 再次调用getopt()时在argv中的索引; * 遇到无法解析选项时,返回 '?' ,显示错误消息,若不想显示则opterr=0; * optopt 最后一个未知选项的索引; #include <getopt.h> int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex); int getopt_long_only(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex); Feature Test Macro Requirements for glibc (see feature_test_macros(7)): getopt(): _POSIX_C_SOURCE >= 2 || _XOPEN_SOURCE getopt_long(), getopt_long_only(): _GNU_SOURCE
argc,**argv: main函数传递
*optstring: 对于每一个字符选项而言,'c'表示无参数;'c:'表示有参数,形式 "-c Argument"/"-cArgument";'c::'表示参数可有可无,若有形式只能是'-cArgument'。
struct option数组最后的元素全0,*longindex保存当前数组索引。
struct option { const char *name; /* 长选项名字 */ int has_arg; /* 选项是否有参数:no_argument,0;required_argument,1;optional_argument,2 */ int *flag; int val; }; /* *flag,val仅作用于长选项 * flag==NULL时,val; * flag!=NULL时,返回 0,val保存到flag中 */
getopt成功,返回选项字符;解析完毕返回-1;遇到不在optstring中的选项,返回 '?';遇到缺少参数的选项,返回 ':'(若optstring第一个字符为 ':',否则返回 '?'。
getopt_long 短选项,返回对应选项字符;长选项时,返回val(flag==NULL),返回0(flag!=NULL,保存val);其他情况同getopt。
getopt_long例子
#include<string.h> #include<strings.h> #include<stdio.h> #include<stdlib.h> #include<getopt.h> int reload,time; static const struct option long_options[]= { {"force",no_argument,NULL,'f'}, {"reload",no_argument,&reload,2}, {"time",required_argument,NULL,'t'}, {NULL,0,NULL,0} }; int main(int argc, char *argv[]) { int opt=0,options_index=0; while((opt=getopt_long(argc,argv,"frt:?h",long_options,&options_index))!=-1) { switch(opt) { case 'f': printf("case f opt=%c",opt); break; case 'r': printf("case r opt=%c",opt); break; case 't': printf("case t opt=%c",opt); break; case 0: printf("case 0 opt=%c",opt); break; } printf(" optarg=%s\t optind=%d\t opterr=%d\t optopt=%d\t ",optarg,optind,opterr,optopt); printf(" reload=%d,time=%d \n",reload,time); } return 0; }
getopt例子
#include<string.h> #include<strings.h> #include<stdio.h> #include<stdlib.h> #include<getopt.h> #include<unistd.h> int main(int argc, char *argv[]) { int opt; while((opt=getopt(argc,argv,"frt:?h"))!=-1) { switch(opt) { case 'f': printf("case f opt=%c ",opt); break; case 'r': printf("case r opt=%c ",opt); break; case 't': printf("case t opt=%c ",opt); break; } printf("optarg=%s\n",optarg); } return 0; }