getopt()用来解析命令行参数
getopt(int argc,char **argv,const char *shotopts)
第一个参数为命令参数的个数;第二个参数存命令参数;第三个参数为所有可能的参数字符串optstring,仅支持短参数
参数ab:c::d::代表。/getopt -a -b host -chello -d world(world不是参数值,因为-d后面有空格)
getopt()成功后返回第一个选项a,并设置全局变量
optarg:指向当前参数的指针,如果调用函数的人为某个参数赋值,则它指向这个值(eg:b的值host)
optind:再次调用getopt()时的下一个argv指针的索引,下一个参数在列表中得标号
optopt:存储不可知或错误选项
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc,char **argv) { int result; opterr=0;//不输出错误信息 while((result=getopt(argc,argv,"ab:c::")) !=-1)//当没有其他参数可供解析或者出错时,getopt返回-1,同时optind存储第一个未知或者出错选项的下标 { switch(result) { case 'a': printf("option=a,optopt=%c,optarg=%s\n",optopt,optarg); break; case 'b': printf("option=b,optopt=%c,optarg=%s\n",optopt,optarg); break; case 'c': printf("option=c,optopt=%c,optarg=%s\n",optopt,optarg); break; case '?': printf("result=?,optopt=%c,optarg=%s\n",optopt,optarg);//当命令行选项字符不包括在optstring里或者选项缺少必要参数时 break; default: printf("default,result=%c\n",result); break; } printf("argv[%d]=%s\n",optind,argv[optind]); } printf("result=-1,option=%d\n",optind); for(result=optind;result<argc;result++) printf("-----argv[%d]=%s\n",result,argv[result]); for(result=1;result<argc;result++) printf("at the end-----argv[%d]=%s\n",result,argv[result]); return 0; }
[root@sun 命令行选项及参数]# ./getopt -a host -b hello -cworld -d option=a,optopt=,optarg=(null) argv[2]=host option=b,optopt=,optarg=hello argv[5]=-cworld option=c,optopt=,optarg=world argv[6]=-d result=?,optopt=d,optarg=(null) argv[7]=(null) result=-1,option=6 -----argv[6]=host at the end-----argv[1]=-a at the end-----argv[2]=-b at the end-----argv[3]=hello at the end-----argv[4]=-cworld at the end-----argv[5]=-d at the end-----argv[6]=host
getlongopt()用来获取命令行参数
getlongopt(int argc,char **argv,const char *shotopts,const struct *longopts,int *longind)
支持长参数