命令列引數解析函式getopt_long() 使用詳解
當一個用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版)
相關文章
- linux的命令列解析引數之getopt_long函式使用Linux命令列函式
- 1.linux的命令列解析引數之getopt_long函式Linux命令列函式
- 命令列引數選項處理:getopt()及getopt_long()函式使用命令列函式
- linux 中解析命令列引數 (getopt_long用法)Linux命令列
- 使用getopt_long()從命令列獲取引數命令列
- C++ main函式命令列引數使用C++AI函式命令列
- 使用getopt_long()從命令列獲取引數,struct option命令列Struct
- 函式引數詳解函式
- 命令列解析函式命令列函式
- 命令列引數解析模組argparse的使用命令列
- 【C】 33_main 函式與命令列引數AI函式命令列
- C/C++—— 分析命令列引數的getopt()函式使用介紹C++命令列函式
- 一個使用getopt()函式獲取命令列引數的例子(轉)函式命令列
- js-arguments 函式引數物件詳解JS函式物件
- window.open()函式引數用法詳解函式
- python函式星號引數詳解Python函式
- tar命令中--exclude引數使用詳解
- tar命令引數詳解
- lsblk命令引數詳解
- linux-解析命令列選項getopt_long用法Linux命令列
- OpenCV中的findContours函式引數詳解OpenCV函式
- Python命令列引數解析模組argparsePython命令列
- 函式、引數、解構函式
- Linux命令引數詳細解析-mvLinux
- Linux命令引數詳細解析-cpLinux
- Linux命令引數詳細解析-vimLinux
- find 命令的引數詳解
- TAR命令引數詳解(轉)
- Go語言Slice作為函式引數詳解Go函式
- Python print函式引數詳解以及效果展示Python函式
- 做ftp專案中使用命令列引數及 ----python 命令列 解析模組 optparseFTP命令列Python
- Linux 中 RPM 命令引數使用詳解Linux
- java 使用命令列引數(轉)Java命令列
- 使用argparse模組新增命令列引數命令列
- Qt5.9中QObject::connect()函式用法(函式使用的前提條件和引數詳解)QTObject函式
- Uploadify 3.2 引數屬性、事件、方法函式詳解事件函式
- Linux ls命令引數詳解Linux
- opatch命令引數解析