1. 程式人生 > >參數解析函數getopt

參數解析函數getopt

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>
int
main(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