命令列引數解析函式getopt_long() 使用詳解

拉斯發表於2016-05-21

當一個用C語言編寫的Linux或UNIX程式執行時,它是從main函式開始的。對這些程式而言,main函式的宣告如下所示:

int main(int argc, char *argv[])

其中argc是程式引數的個數(int),argv是一個代表引數自身的字串陣列(char **)。無論作業系統何時啟動一個新程式,引數argc和argv都被設定並傳遞給main。這些引數通常由另一個程式提供,這個程式一般是shell,它要求作業系統啟動該新程式。shell接收使用者輸入的命令列,將命令列分解成單詞,然後把這些單詞放入argv陣列。

例如,如果我們給shell輸入如下命令:

$myprog left right 'and center'

程式myprog將從main函式開始,main帶的引數是:
argc: 4
argv: {“myprog”, “left”, “right”, “and center”}
注意:引數個數包括程式名自身,argv陣列也包含程式名並將它作為第一個元素argv[0]。因為我們在shell命令裡使用了引號,所以第四個引數是一個包含了空格的字串。

人們常常希望使用命令列引數向程式傳遞資訊,許多工具程式也使用命令列引數來改變程式的行為或設定選項。通常,你可以使用以短橫線(-)開頭的命令列引數來設定這些所謂的標識(flag)或開關(switch)。我們建議在應用程式中,所有的命令列開關都應以一個短橫線開頭,其後包含單個字母或數字。如果需要,不帶後續引數的選項可以在一個短橫線後歸併到一起,如:ls -lstr。

在程式設計的時候,當命令列引數個數較多時,如果按照順序一個一個定義引數含義很容易造成混亂;如果程式只按順序處理引數的話,一些“可選引數”的功能將很難實現。為了解決此類問題,GNU C庫提供了函式以簡化C/C++程式中的解析工作。

注:Linux系統上可用的C編譯器是GNU C編譯器,它建立在自由軟體基金會的程式設計許可證的基礎上,因此可以自由釋出。GNU C 對標準C進行進一步擴充套件,以增強標準C的功能。函式getopt_long能夠同時處理長短兩種格式的選項,要使用這個函式,請包含標頭檔案

getopt_long(int argc, char* argv[], const char *optstring, const struct option *longopts, int *longindex);
  • 引數optstring:負責處理短引數。也稱為選項指定符字串,該字串告訴getopt哪些選項可用,以及它們是否有關聯值。optstring只是一個字元列表,每個字元代表一個單字元選項。如果一個字元後面緊跟一個冒號,則表明該選項有一個關聯值作為下一個引數。

optstring的格式舉例說明比較方便,例如:
char *optstring = “abcd:”;
上面這個optstring在傳入之後,getopt函式將依次檢查命令列是否指定了 -a, -b, -c及 -d(這需要多次呼叫getopt函式,直到其返回-1),當檢查到上面某一個引數被指定時,函式會返回被指定的引數名稱(即該字母)
最後一個引數d後面帶有冒號,: 表示引數d是可以指定值的,如 -d 100 或 -d user。

  • 引數longopts:負責處理長引數。指向一個由option結構體組成的陣列,那個陣列的每一個元素都指明瞭一個長引數(形如”–name”的引數)名稱和性質:
 struct option {
               const char *name;
               int         has_arg;
               int        *flag;
               int         val;
           };

name:引數名稱

has_arg:指明是否帶引數值,其數值可選:

no_argument(即 0)表明這個長引數不帶引數(即不帶數值,如:--name)
required_argument (即 1) 表明這個長引數必須帶引數(即必須帶數值,如:--name Bob)
optional_argument(即 2)表明這個長引數後面帶的引數是可選的,(即--name和--name Bob均可)

flag:設定為NULL表示當找到該選項時,getopt_long返回在成員val裡給出的值。否則,getopt_long返回0,並將val的值寫入flag指向的變數。

val:getopt_long為該選項返回的值。

  • 引數longindex:如果longindex非空,它指向的變數將記錄當前找到引數符合longopts裡的第幾個元素的描述,即是longopts的下標值。

外部變數optarg:在getopt_long迴圈處理選項時,如果選項有一個關聯值,則外部變數optarg指向這個值。


參考連結:

[1] http://blog.csdn.net/cashey1991/article/details/7942809

[2] Linux程式設計(第4版)

相關文章