函式宣告:
#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()函式發現錯誤的時候強制不輸出任何訊息。getopt_long函式包含了getopt函式的功能,並且還可以指定「長引數」(或者說長選項),與getopt函式對比,getopt_long比其多了兩個引數:如果optstring引數的第乙個字元是冒號,例如」:ngl:」,那麼getopt()會保持沉默,並根據錯誤情況返回不同字元,如下:
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...