一、基本概念
getopt是一種命令行參數解析器, 它基於Unix中的POSIX標準。該命令用來解析命令行中的選項參數,當參數比較多時,可以用該命令來方便的處理。
getopt和getopt_long 處理命令行參數相對於手寫處理具有很多優劣之處。其中最顯著的是它可以自動處理 POSIX 規範中指定的單字母選項和長選項,而且它會自動處理重複的選項。
getopt的最基本用法如下:
int getopt(int argc, char * const argv[], const char *optstring);
該函數在解析命令行參數時,會返回一個選項字元,用來標識當前參數是哪一個。同時,由於存在必選參數和可選參數,程序員需要自行解析optopt等全局變數來處理不同的情況。optstring參數用來指定哪些選項是可選的,哪些選項要求必須指定參數等等(「單字母選項」)。
二、用法示例
1、無參數選項
使用getopt可以很好地處理無參數選項。在命令行中,只需要輸入選項的名稱(比如 「-h」 或「–help」)就可以使用該選項。例如:
int main(int argc, char *argv[]) { int opt; while ((opt = getopt(argc, argv, "h")) != -1) { switch (opt) { case 'h': printf("Help information\n"); break; default: break; } } return 0; }
上述代碼定義了一個「幫助」選項。用戶輸入 -h 或 –help 時,會在命令行中輸出幫助信息。
2、有參數選項
當選項需要帶有參數時,可以使用getopt函數中的全局變數optarg。例如:
int main(int argc, char *argv[]) { int opt; char *file_path; while ((opt = getopt(argc, argv, "f:")) != -1) { switch (opt) { case 'f': file_path = optarg; // do something with file_path break; default: break; } } return 0; }
上述代碼定義了一個「文件」選項。用戶輸入 -f file_path 時,會自動解析出 file_path,並把它存入全局變數 optarg 中。用戶可以在 switch-case 代碼塊中使用 optarg 對 file_path 進行操作。
3、混合使用選項
使用 getopt 處理混合式選項時,需要注意選項的順序。getopt函數會循環讀取命令行參數,例如輸入命令:
./test -h -v -f file_path
代碼中 -h 和 -v 都是無參數選項,但 -f 是帶參數的選項。
int main(int argc, char *argv[]) { int opt; char *file_path; while ((opt = getopt(argc, argv, "hv:f:")) != -1) { switch (opt) { case 'h': printf("Help information\n"); break; case 'v': printf("Verbose information\n"); break; case 'f': file_path = optarg; // do something with file_path break; default: break; } } return 0; }
上述代碼演示了如何處理混合式選項。在代碼中,選項的順序不是固定的,getopt函數可以循環讀取到正確的選項字元。
三、getopt_long的使用
對於含有大量選項的命令,getopt_long 函數則顯得更加合適,因為它支持長選項(帶有 — 前綴的選項)和附加的幫助文本(help text)。
getopt_long 的使用方法與 getopt 差不多,這裡就不贅述了。它的函數定義如下:
int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
注意: 英文逗號。記住:–help 這種長格式選項前是兩個減號,而普通選項前是一個減號,且短格式選項可以組合,如 -hv。
下面是 getopt_long 函數的示例代碼:
#include #include int main(int argc, char *argv[]) { int opt = 0; struct option long_options[] = { {"help", no_argument, 0, 'h'}, {"verbose", no_argument, 0, 'v'}, {"file", required_argument, 0, 'f'}, {0, 0, 0, 0} }; int option_index = 0; char * file_path; while ((opt = getopt_long(argc, argv, "hvf:", long_options, &option_index)) != -1) { switch(opt) { case 'h': printf("Help information\n"); break; case 'v': printf("Verbose information\n"); break; case 'f': file_path = optarg; // do something with file_path break; default: break; } } return 0; }
四、總結
getopt 和 getopt_long 是處理命令行參數的兩個重要工具,尤其對於有多個選項的命令來說,使用這兩個函數能夠有效地提高程序解析命令行的效率,並且使代碼更具可讀性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/283068.html