整理 getopt和getopt long函式

2021-07-13 06:05:42 字數 4056 閱讀 1702

函式宣告:

#include 

int getopt(int argc, char * const argv,

const

char *optstring);

extern

char *optarg;

extern

int optind, opterr, optopt;

#include

int getopt_long(int argc, char * const argv,

const

char *optstring,

const

struct option *longopts, int *longindex);

argc、argv就是main函式的argc和argv,這兩者直接傳入即可

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

例如:

char *optstring = "abcd:";
上面這個optstring在傳入之後,getopt函式將依次檢查命令列是否指定了 -a, -b, -c及 -d(這需要多次呼叫getopt函式,直到其返回-1),當檢查到上面某乙個引數被指定時,函式會返回被指定的引數名稱(即該字母)

最後乙個引數d後面帶有冒號,: 表示引數d是可以指定值的,如 -d 100 或 -d user。

getopt() 第一次呼叫時返回第乙個選項,並設定一些全域性變數。使用相同的引數再次呼叫該函式時,它將返回下乙個選項,並設定相應的全域性變數。如果不再有可識別的選項,將返回 -1,此任務就完成了。

getopt() 所設定的全域性變數包括:

char *optarg——當前選項引數字串(如果有)。

int optind——argv的當前索引值。當getopt()在while迴圈中使用時,迴圈結束後,剩下的字串視為運算元,在argv[optind]至argv[argc-1]中可以找到。

int opterr——這個變數非零時,getopt()函式為「無效選項」和「缺少引數選項,並輸出其錯誤資訊。

int optopt——當發現無效選項字元之時,getopt()函式或返回』?』字元,或返回』:』字元,並且optopt包含了所發現的無效選項字元。

示例:

#include 

#include

#include

int main(int argc, char *argv)

return

0;

}

執行結果

$ ./test_getopt -a 100 -b 200 -c admin -d  

opt = a

optarg = 100

optind = 3

argv[optind - 1] = 100

opt = b

optarg = 200

optind = 5

argv[optind - 1] = 200

opt = c

optarg = admin

optind = 7

argv[optind - 1] = admin

opt = d

optarg = (null)

optind = 8

argv[optind - 1] = -d

錯誤的呼叫程式,要麼是命令列選項無效,要麼是缺少選項引數,正常情況下,getopt()會為這兩種情況輸出自己的出錯資訊,並且不區分的均返回』?』。可以採用以下兩種方法來更改getopt()函式的出錯資訊輸出行為:

在呼叫getopt()之前,將opterr設定為0, getopt()函式發現錯誤的時候強制不輸出任何訊息。

如果optstring引數的第乙個字元是冒號,例如」:ngl:」,那麼getopt()會保持沉默,並根據錯誤情況返回不同字元,如下:

getopt_long函式包含了getopt函式的功能,並且還可以指定「長引數」(或者說長選項),與getopt函式對比,getopt_long比其多了兩個引數:

longopts指向的是乙個由option結構體組成的陣列,那個陣列的每個元素,指明了乙個「長引數」(即形如–name的引數)名稱和性質:

struct

option ;

name  是引數的名稱

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

- no_argument (即 0) 表明這個長引數不帶引數(即不帶數值,如:--name)

- required_argument (即 1) 表明這個長引數必須帶引數(即必須帶數值,如:--name bob)

- optional_argument(即2)表明這個長引數後面帶的引數是可選的,(即--name和--name bob均可)

flag 當這個指標為空的時候,函式直接將val的數值從getopt_long的返回值返回出去,當它非空時,val的值會被賦到flag指向的整型數中,而函式返回值為0

val 用於指定函式找到該選項時的返回值,或者當flag非空時指定flag指向的資料的值。

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

示例

#include 

#include

#include

#include

int

main(int argc, char **argv)

, ,

, };

while ( (opt = getopt_long(argc, argv, optstring, long_options, &option_index)) != -1)

return

0;

}

執行結果

$ ./test_getopt_long -a 100 --reqarg 100 --nonarg  

opt = a

optarg = 100

optind = 3

argv[optind - 1] = 100

option_index = 0

opt = r

optarg = 100

optind = 5

argv[optind - 1] = 100

option_index = 0

./test_getopt_long: unrecognized option '--nonarg'

opt = ?

optarg = (null)

optind = 6

argv[optind - 1] = --nonarg

option_index = 0

當所給的引數存在問題時,opt(即函式返回值是』?』),如:

$ ./test_getopt_long -a  

./test_getopt_long: option requires an argument -- 'a'

opt = ?

optarg = (null)

optind = 2

argv[optind - 1] = -a

option_index = 0

$ ./test_getopt_long --reqarg

./test_getopt_long: option '--reqarg' requires an argument

opt = ?

optarg = (null)

optind = 2

argv[optind - 1] = --reqarg

【參考:

getopt 用法詳解

getopt被用來解析命令列選項引數。就不用自己寫東東處理ar 了。include extern char optarg 選項的引數指標 extern int optind,下一次呼叫getopt的時,從optind儲存的位置處重新開始檢查選項。extern int opterr,當opterr 0...

getopt函式和getopt long函式

預備知識 1.getopt getopt在unix下的命令列程式特別好用,特別是在你有許多引數要加入時。表頭檔案 i nclude 函式宣告 int getopt int argc,char const argv,const char optstring 函式說明 getopt 用來分析命令列引數。...

getopt和getopt long函式使用詳解

getopt和getopt long函式使用詳解 在我們操作命令行的時候,main函式中輸入引數乙個乙個分析不免麻煩,我們可以使用linux的引數分析函式解決此問題方便省力。include int getopt int argc,char const argv,const char optstrin...