在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頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...