getopt/getopt_long函數進行參數解析
1.參數原型
getopt()函數的參數原型
int getopt(int argc, char * const argv[], const char *optstring);
getopt_long()函數的參數原型
int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
getopt函數只能處理短選項,而getopt_long函數兩者都可以。通常情況下我們都是使用getopt_long()函數。
2.參數和返回值分析
-
argc, argv參數和main()函數的參數一致,這裏就不做過多介紹。
-
optstring: 表示短選項字符串。且規範格式如下:
1)單個字符爲參數選項
2)選項字符後面跟“:”,表示該選項必須具備參數,參數與選項之間必須有空格分隔, 如:start -f flile。
3)選項字符後面跟“::”, 表示該選項必須具備參數,且參數緊跟選項,二者連在一起,例如:start -ffile 。 -
struct option* longopts:長選項結構體,保存長選項的信息。
struct option
{
const char *name;
int has_arg;
int *flag;
int val;
}
1)name:長選項的名字
2)has_arg:如果選項不帶參數,則值爲no_argument(或0);如果選項需要參數,則值爲required_argument (或 1);或者如果選項接受可選參數,則值爲optional_argument(或2)。
3) flag:指定如何返回長選項的結果。如果標誌爲空,則getopt_long()返回參數val的值(例如調用程序可能會將val設置爲等效的短選項字符。)否則,getopt_long()返回0,flag指向一個變量,該變量設置爲參數val的值;
4) val:要返回的值,或加載到flag參數指向的變量中的值
5) 該結構體的最後一個元素必須用0來填充
- longindex:如果longindex不爲空,則指向一個變量,該變量設置爲長選項相對於longopts的索引(即數組的下標值)。
- 返回值
1)如果短選項找到,那麼將返回短選項對應的字符。
2)如果長選項找到,如果flag爲NULL,返回val。如果flag不爲空,返回0
3)如果遇到一個選項沒有在短字符、長字符裏面。或者在長字符裏面存在二義性的,返回“?”
4)如果解析完所有字符沒有找到(一般是輸入命令參數格式錯誤,eg: 連斜槓都沒有加的選項),返回“-1”
5)如果選項需要參數,忘了添加參數。返回值取決於optstring,如果其第一個字符是“:”,則返回“:”,否則返回“?”。
3.代碼示例
struct option long_options[] =
{
{"daemon", no_argument, NULL, 'b'},
{"port", required_argument, NULL, 'p'},
{"help", no_argument, NULL, 'h'},
{NULL, 0, NULL, 0}
};
opt = getopt_long(argc, argv, "bp:h", long_options, NULL)
if(opt == -1)
break;
switch(opt)
{
case 'b':
daemon_run = 1;
break;
case 'p':
serv_port = atoi(optarg);
break;
case 'h':
print_usage(progname);
return EXIT_SUCCESS;
default:
break;
}