getopt_long函式基本用法-linux

_charles_發表於2013-08-06

一、感性認識:

[c-sharp] view plaincopy
  1. #include <stdio.h>  
  2. #include <getopt.h>  
  3. char * l_opt_arg;  
  4. char const short_options = "nbl:"//單冒號表示是否帶有引數[l帶有引數後面加冒號] 
  5. struct option long_options[] = {  
  6.      { "name",     0,   NULL,    'n'     },  
  7.      { "bf_name",  0,   NULL,    'b'     },  
  8.      { "love",     1,   NULL,    'l'     },  
  9.      {      0,     0,     0,     0},  
  10. };  
  11. /* 
  12. 長選項我們用一個option結構體陣列表示長選項的資訊:
  13. 第一項:表示長選項的名字。
  14. 第二項:用來決定此長選項是否要帶引數。[這裡用數值表示]
  15. 第三項:我們一般都置為NULL,用來決定getopt_long函式的返回值就是第四個選項的值
  16. 第四項:是此長選項相對應的短選項值,因此一旦此函式讀到此長選項時,就返回與此長選項相對應的短選項
  17. */
  18. int main(int argc, char *argv[])  
  19. {  
  20.      int c;  
  21.      while((c = getopt_long (argc, argv, short_options, long_options, NULL)) != -1)  
  22.      {  
  23.          switch (c)  
  24.          {  
  25.          case 'n':  
  26.              printf("My name is XL./n");  
  27.              break;  
  28.          case 'b':  
  29.              printf("His name is ST./n");  
  30.              break;  
  31.          case 'l':  
  32.              l_opt_arg = optarg;  //optarg代表引數
  33.              printf("Our love is %s!/n", l_opt_arg);  
  34.              break;  
  35.          }  
  36.      }  
  37.      return 0;  
  38. }  

編譯:

[root@localhost liuxltest]# gcc -o getopt getopt.c

執行1:

[root@localhost liuxltest]# ./getopt -n -b -l forever(這個是引數

My name is XL.

His name is ST.

Our love is forever!

執行2:

[root@localhost liuxltest]# ./getopt -nb -l forever

My name is XL.

His name is ST.

Our love is forever!

執行3:

[root@localhost liuxltest]# ./getopt -nbl forever  

My name is XL.

His name is ST.

Our love is forever!

二、概念

getopt_long支援長選項的命令列解析,使用man getopt_long,得到其宣告如下:

#include <getopt.h>

int getopt_long(int argc, char * const argv[],

const char *optstring,

const struct option *longopts, int *longindex);


說明:

argcargv通常直接從main()到兩個引數傳遞而來。

optsting 是選項引數組成的字串,如果該字串裡任一字母后有冒號,那麼這個選項就要求有引數。

longopts 是指向陣列的指標,這個陣列是

 struct option {

              const char *name;

              int has_arg;

              int *flag;

              int val;

    };

const char *name:

選項名,前面沒有短橫線。譬如"help"、"verbose"之類。

int has_arg:

描述長選項是否有選項引數,如果有,是哪種型別的引數,其值見下表:

符號常量                          數值            含義

no_argument                 0                 選項沒有引數

required_argument      1                 選項需要引數

optional_argument       2                 選項引數是可選的

int *flag:

如果該指標為NULL,那麼getopt_long返回val欄位的值;

如果該指標不為NULL,那麼會使得它所指向的結構填入val欄位的值,同時getopt_long返回0

int val:

如果flag是NULL,那麼val通常是個字元常量,如果短選項和長選項一致,那麼該字元就應該與optstring中出現的這個選項的引數相同;


longindex 一般賦為NULL即可;如果沒有設定為NULL,那麼它就指向一個變數,這個變數會被賦值為尋找到的長選項在longopts中的索引值,這可以用於錯誤診斷。


幾種常用返回值:

1、每次呼叫該函式,它都會分析一個選項,並且返回它的短選項,如果分析完畢,即已經沒有選項了,則會返回-1。

2、如果getopt_long()在分析選項時,遇到一個沒有定義過的選項,則返回值為‘?’,此時,程式設計師可以列印出所定義命令列的使用資訊給使用者。

3、當處理一個帶引數的選項時,全域性變數optarg會指向它的引數

4、當函式分析完所有引數時,全域性變數optind(into argv)會指向第一‘非選項’的位置






相關文章