直接上代碼:涉及函數getopt(),getopt_long()
int getopt(int argc, char * const argv[], const char *optstring);
該函數用來解析指令行參數。前兩個參數設為main函數的兩個參數。
optstring設為由該指令要處理的各個選項組成的字元串。選項後面帶有冒号':'時,
該選項是一個帶參數的選項。
例如:make -f filename -n
-f是一個帶參數的選項,-n是一個沒有參數的選項。
可以下面這樣調用函數getopt來解析上面的例子。
c = getopt(argc, argv, "f:n");
此函數的傳回值即為目前找到的指令選項,全部選項都找到時的傳回值為-1。
通常一個指令有多個選項,為了取得所有選項,需要循環調用此函數,直到傳回值為-1。
要使用此函數,還有幾個全局變量必須要了解。
extern char *optarg;
extern int optind, opterr, optopt;
optarg: 目前選項帶參數時,optarg指向該參數。
optind: argv的索引。通常選項參數取得完畢時,通過此變量可以取得非選項參數(argv[optind])
optopt: 一個選項在argv中有,但在optstring中不存在時,或者一個帶參數的選項沒有參數時,
getopt()傳回'?',同時将optopt設為該選項。
opterr: 将此變量設定為0,可以抑制getopt()輸出錯誤資訊。
int getopt_long(int argc, char * const argv[],
const char *optstring,
const struct option *longopts, int *longindex);
這是支援長指令選項的函數,長選項以'--'開頭。
前三個參數與函數getopt的參數是一樣的。隻支援長選項時,參數optstring設定為NULL或者空字元串
第四個參數是一個構造體struct option的數組。此構造體定義在頭檔案getopt.h中。
struct option {
const char *name;
int has_arg;
int *flag;
int val;
};
構造體各個成員的解釋如下
name : 長選項的名字
has_arg: no_argument或0表示此選項不帶參數,required_argument或1表示此選項帶參數,optional_argument或2表示是一個可選選項。
flag : 設定為NULL時,getopt_long()傳回val,設定為NULL以外時,getopt_long()傳回0,且将*flag設為val。
val : 傳回值或者*flag的設定值。有些指令既支援長選項也支援短選項,可以通過設定此值為短選項實作。
此數組的最後一個須将成員都置為0。
關于傳回值有以下幾種情況:
識别為短選項時,傳回值為該短選項。
識别為長選項時,如果flag是NULL的情況下,傳回val,如果flag非NULL的情況下,傳回0。
所有選項解析結束時傳回-1。
存在不能識别的選項或者帶參數選項的參數不存在時傳回'?