歡迎使用CSDN markdown編輯器

2021-07-03 20:30:38 字數 4439 閱讀 4336

在linux中,我們可以使用getopt、getopt_long、getopt_long_only來對這個問題進行處理。

[cpp] view plaincopy在code上檢視**片派生到我的**片

#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);

int getopt_long_only(int argc, char * const argv,

const char *optstring,

const struct option *longopts, int *longindex);

從最簡單的getopt講起,getopt函式的前兩個引數,就是main函式的argc和argv,這兩者直接傳入即可,要考慮的就只剩下第三個引數。

optstring的格式舉例說明比較方便,例如:

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

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

optind表示的是下乙個將被處理到的引數在argv中的下標值。

如果指定opterr = 0的話,在getopt、getopt_long、getopt_long_only遇到錯誤將不會輸出錯誤資訊到標準輸出流。

[cpp] view plaincopy在code上檢視**片派生到我的**片

#include #include #include int main(int argc, char *argv)  

return 0;

}

編譯上述程式並執行,有如下結果:

[cpp] view plaincopy在code上檢視**片派生到我的**片

cashey@ubuntu:~/desktop/getopt$ ./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_long函式,getopt_long函式包含了getopt函式的功能,並且還可以指定「長引數」(或者說長選項),與getopt函式對比,getopt_long比其多了兩個引數:

int getopt(int argc, char * const argv,

const char *optstring);

int getopt_long(int argc, char * const argv,

const char *optstring,

const struct option *longopts, int *longindex);

在這裡,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的下標值。

[cpp] view plaincopy在code上檢視**片派生到我的**片

#include #include #include #include int  

main(int argc, char **argv)

, ,

, };

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

return 0;

}

編譯執行以上程式並執行,可以得到以下結果:

[plain] view plaincopy在code上檢視**片派生到我的**片

cashey@ubuntu:~/desktop/getopt$ ./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(即函式返回值是』?』),如:

[plain] view plaincopy在code上檢視**片派生到我的**片

cashey@ubuntu:~/desktop/getopt$ ./test_getopt_long -a  

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

opt = ?

optarg = (null)

optind = 2

argv[optind - 1] = -a

option_index = 0

cashey@ubuntu:~/desktop/getopt$ ./test_getopt_long --reqarg

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

opt = ?

optarg = (null)

optind = 2

argv[optind - 1] = --reqarg

最後說說getopt_long_only函式,它與getopt_long函式使用相同的參數列,在功能上基本一致,只是getopt_long只將–name當作長引數,但getopt_long_only會將–name和-name兩種選項都當作長引數來匹配。在getopt_long在遇到-name時,會拆解成-n -a -m -e到optstring中進行匹配,而getopt_long_only只在-name不能在longopts中匹配時才將其拆解成-n -a -m -e這樣的引數到optstring中進行匹配。

歡迎使用CSDN markdow

本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...

歡迎毛毛與妞妞使用CSDN markdown編輯器

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...

歡迎使用CSDN markdow1n編輯器

本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...