C庫中提供了相應的函數接口供用戶解析命令行選項,我們常使用的有getopt_long_only和getopt_long,在使用的方法上相差不大。
命令行選項中一般可以選擇傳遞長選項和短選項
長選項的用法為: ./a.out --username bryant --help
短選項的用法為: ./a.out -n bryant -h -v
1. 函數接口
函數使用的頭文件為 #include
2. 參數介紹
? argc、argv : 從main函數傳遞而來。
? shortopts : 短選項字符串。如“n:v”,短選項字符串不需要"-",而且短選項需要傳遞參數時,在短選項后面加上":"。
一般使用的時候,定義一個空的shortopts即可。
? longopts : struct option 數組,用于存放長選項參數。
struct option {
const char *name; //長選項名
int has_arg; //是否需要參數
int *flag;
int val;
};
has_arg的值有三種情況。
#define no_argument 0
#define required_argument 1
#define optional_argument 2
? longind : 用于返回長選項在longopts結構體數組中的索引值,用于調試。一般置為NULL。
flag和val兩個值相互依賴,主要分兩種情況。
(1) flag為NULL時,val值用于確定該長選項,所以需要長選項指定唯一的val值。這里也為長選項和短選項建立了橋梁。
(2) flag不為NULL時,將val值存放到flag所指向的存儲空間,用于標識該長選項出現過。
3. 返回值
? 程序中使用短選項,則返回短選項字符,例如傳遞-n,如果需要參數,則將參數保存在optarg中。!optarg不需要定義,在getopt.h中已經有定義
? 程序中使用長選項,則根據flag和val的值確定。當flag為NULL時,返回val值(val值必須唯一)。當value值等于短 選項的值時,可以使用短選項解析長選項;當flag不為NULL時,則將val值存入flag所指向的存儲空間,此時getopt_long返回零。
? 出現未定義的長選項或短選項,則返回?
? 解析完畢,getopt_long返回 -1;
{"help", no_argument, 0, 0},
{"h", no_argument, 0, 0},
{0, 0, 0, 0}
};
while ((c = getopt_long_only(argc, argv, optstring, opts, &index)) != -1) {
printf("index = %d, c = %d\n", index, c);
switch (index) {
case 0:
case 1:
printf("username:%s\n", optarg);
break;
case 2:
case 3:
printf("version:1.0.0\n");
break;
case 4:
case 5:
printf("debug:yes\n");
break;
case 6:
case 7:
printf("help:?\n");
break;
default:
printf("other:%d\n", index);
break;
}
}
return 0;
}
如果使用如上的方式是將得到選項(長選項或短選項)在結構體數組中的位置,并將該值存放在index中。在while中判定選項的下標即可,如果需要獲得參數中傳遞的值,則將該值保存到optarg中。
上圖的程序編譯之后,解析命令行選項如下圖:
傳遞短選項:
傳遞長選項:
長選項短選項混合:
使用這種方式可以得到短選項的字符值,用戶通過該值進行判斷。
傳遞短選項:
傳遞長選項: