基於Linux下的getopt()/getopt_long()函數進行參數解析

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.參數和返回值分析

  1. argc, argv參數和main()函數的參數一致,這裏就不做過多介紹。

  2. optstring: 表示短選項字符串。且規範格式如下:
    1)單個字符爲參數選項
    2)選項字符後面跟“:”,表示該選項必須具備參數,參數與選項之間必須有空格分隔, 如:start -f flile。
    3)選項字符後面跟“::”, 表示該選項必須具備參數,且參數緊跟選項,二者連在一起,例如:start -ffile 。

  3. 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來填充

  1. longindex:如果longindex不爲空,則指向一個變量,該變量設置爲長選項相對於longopts的索引(即數組的下標值)。
  2. 返回值
    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;    
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章