參數解析函數getopt
阿新 • • 發佈:2018-02-06
def tde isp 參數 正常 dem std break more
今天看到了遇到了一個很好的unix參數解析函數getopt(),記錄一下:
函數原型
int getopt(int argc, char *const *argv, const char *options)
這個函數被定義在頭文件<unistd.h>中,同時頭文件中定義了四個與這個函數有關變量。
int opterr: 控制是否將遇到錯誤信息(缺少參數等)打印到stderr。當這個值被賦予非零(或者使用default)的時候會打印錯信息到stderr,當這個值被賦予0時則不打印錯誤信息。
int optopt: 當getopt遇到一個未知參數或者參數缺少必要參數值時,會將參數記錄在optopt。保存的這個參數可以被用戶用來錯誤處理。
int optind: 一個索引,指向下一個沒有被getopt中options匹配到的值,可以用這個參數來記錄non-options的開始。初始值為1。
char *optarg: 指向option後面的參數。
函數返回值
正常返回option character;
no more option arguments返回 -1;
非法option返回character ‘?‘;
Demo
#include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<ctype.h> intmain(int argc,char ** argv) { int c,index; int aflag; char * bvalue =NULL, *cvalue=NULL; opterr =0; while((c=getopt(argc, argv,"ab:c::"))!=-1) //a不跟參數(無冒號),b一定有參數(單冒號),c後面參數可有可無(雙冒號) switch(c) { case ‘a‘: aflag=1; break; case ‘b‘: bvalue=optarg; break; case ‘c‘: cvalue=optarg; break; case ‘?‘: if(optopt == ‘c‘) fprintf(stderr,"Option -%c require an argument.\n",optopt); else if(isprint(optopt)) fprintf(stderr,"Unknow ‘-%c‘.\n",optopt); else fprintf(stderr,"Unknow option character‘\\x%x.\n‘",optopt); return 1; default: abort(); } printf("aflag=%d\nbvalue=%s\ncvalue=%s\n",aflag,bvalue,cvalue); for(index=optind; index<argc; index++) { printf("Non-option argument %s\n", argv[index]); } return 0; }
參考文獻:
https://www.gnu.org/software/libc/manual/html_node/Getopt.html#Getopt
參數解析函數getopt