歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> 命令行參數解析函數getopt_long() 使用詳解

命令行參數解析函數getopt_long() 使用詳解

日期:2017/3/3 12:33:31   编辑:Linux技術
當一個用C語言編寫的Linux或UNIX程序運行時,它是從main函數開始的。對這些程序而言,main函數的聲明如下所示:
[code]int main(int argc, char *argv[])

其中argc是程序參數的個數(int),argv是一個代表參數自身的字符串數組(char **)。無論操作系統何時啟動一個新程序,參數argc和argv都被設置並傳遞給main。這些參數通常由另一個程序提供,這個程序一般是shell,它要求操作系統啟動該新程序。shell接收用戶輸入的命令行,將命令行分解成單詞,然後把這些單詞放入argv數組。
例如,如果我們給shell輸入如下命令:
[code]$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能夠同時處理長短兩種格式的選項,要使用這個函數,請包含頭文件
[code]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”的參數)名稱和性質:
[code] struct option {
               const char *name;
               int         has_arg;
               int        *flag;
               int         val;
           };

name:參數名稱
has_arg:指明是否帶參數值,其數值可選:
[code]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] /content/8033413.html
[2] Linux程序設計(第4版)
Copyright © Linux教程網 All Rights Reserved