Linux getopt引數解析

2021-09-13 22:52:14 字數 1903 閱讀 9011

#include int getopt(int argc, char * const ar**,

const char *optstring);

extern char *optarg;

extern int optind, opterr, optopt;

getopt函式需要傳入對應的argc和ar**參數列,還需要乙個optstring:比如 getopt(argc, ar**, 「ab:c::」);

1. 單個字元表示選項,比如示例中的a選項。可以通過傳入"-a"來觸發選項。

2. 字元後加:表示選項後要加乙個引數,比如示例中的b選項,可以通過"-b ***"來傳入選項。

3. 字元後加::表示選項後可選擇加乙個引數或者不加,比如示例中的c選項,可以通過"-c"或者"-c***"的格式來傳入選項。

除了對應的getopt函式外,標頭檔案中還定義了全域性變數optarg、optind、opterr、optopt:

optind:表示下乙個要被getopt解析的ar**引數index索引號

optarg:如果選項後加引數的話,此變數會存入對應的引數

opterr:當getopt發現乙個無法識別的選項時會列印一條錯誤資訊到stderr,如果呼叫函式設定opterr=0, 此錯誤資訊就不再列印出來。

optopt:當getopt發現乙個無法識別的選項時會把對應的選項賦值給optopt,否則optopt為空,然後返回』?』。

示例:

#include #include #include int

main(int argc, char *ar**)

}printf("f_flag=%d; t_flag=%d; nsecs=%d; optind=%d\n", f_flag, t_flag, nsecs, optind);

if (optind >= argc) else

exit(exit_success);

}

#include int getopt_long(int argc, char * const ar**,

const char *optstring,

const struct option *longopts, int *longindex);

int getopt_long_only(int argc, char * const ar**,

const char *optstring,

const struct option *longopts, int *longindex);

除了上面介紹的getopt選項函式之外,如果我們想要支援"–help"這種型別的長選項,可以使用這個函式,這個函式可以同時定義短選項和長選項,argc和ar**依然是參數列;optstring和上文一致表示的是短選項;longopts表示長選項,傳入的是乙個結構體陣列;longindex表示當前返回的選項對應在陣列中的索引index。

對應的全域性變數optarg、optind依然是可以用的。關於struct option的定義:

struct option ;
如果flag為null,那麼getopt_long匹配到選項後會返回val;否則getopt_long匹配到選項後返回值為0,flag指向的變數會被設定為val的值。

示例:

#include #include #include int

main(int argc, char **ar**)

, ,

};int option_index = 0;

while (1)

}if (optind >= argc) else

exit(exit_success);

}

可變引數解析

提供了以下資料型別和巨集,以便我們編寫長度可變的函式 typedef char va list define intsizeof n sizeof n sizeof int 1 sizeof int 1 define va start ap,v ap va list v intsizeof v de...

csr matrix引數解析

indptr np.array 0,2,3,6 indices np.array 0,2,2,0,1,2 data np.array 1,2,3,4,5,6 csr matrix data,indices,indptr shape 3,3 toarray array 1,0,2 0,0,3 4,5,...

git clone引數解析

git官網 概要git clone template l s no hardlinks q n bare mirror o b u reference dissociate separate git dir depth no single branch no tags rerserse submod...