命令列引數的獲取
阿新 • • 發佈:2019-02-12
時不時我們會遇到對命令含引數的處理,如果引數個數較多,按照順序處理有可能會出現錯誤或者一些可選引數將不能實現,接下來介紹幾個處理命令列引數的函式
- getopt
#include <unistd.h>
int getopt(int argc, char * const argv[],
const char *optstring);
extern char *optarg;//帶值引數的值
extern int optind, opterr, optopt;
//optind:下一個要被處理的引數在argv中的下標值
//opterr:如果opterr=0,在函數出現錯誤是,就不會將錯誤資訊列印在標準輸出上
//optopt:函式返回值
getopt函式的前兩個引數argc和argv根main函式的一樣,第三個引數optstring就是我們要解析的很多引數;
eg:
char* optstring = "avtc:l";
傳入opstring之後,函式會依次檢查命令是否指定了-a,-v,-t,-c,-l;如果檢查到制定了某個引數,函式就會返回該引數的名稱(一直檢查到返回-1)
c後面有冒號表示這個引數可以指定值;-c 100
- getopt_long
#include <getopt.h>
int getopt_long(int argc, char * const argv[],
const char *optstring,
const struct option *longopts,
int *longindex);
前三個引數和getopt一樣,該函式包括getopt的功能,並且支援指定長引數
第四個引數: longopts是一個結構體(option)陣列
struct option {
const char *name;
int has_arg;
int *flag;
int val;
};
//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指向的資料的值。
//eg:
static const struct option long_options[] =
{
{ "force", no_argument, &force, 1 },
{ "reload", no_argument, &force_reload, 1 },
{ "time", required_argument, NULL, 't' },
{ "help", no_argument, NULL, '?' },
{ "http09", no_argument, NULL, '9' },
{ "http10", no_argument, NULL, '1' },
{ "http11", no_argument, NULL, '2' },
{ "get", no_argument, &method, METHOD_GET },
{ "head", no_argument, &method, METHOD_HEAD },
{ "options", no_argument, &method, METHOD_OPTIONS },
{ "trace", no_argument, &method, METHOD_TRACE },
{ "version", no_argument, NULL, 'V' },
{ "proxy", required_argument, NULL, 'p' },
{ "clients", required_argument, NULL, 'c' },
{ NULL, 0, NULL, 0 }
};
第五個引數:記錄當前longopts的下標
int getopt_long_only(int argc, char * const argv[],
const char *optstring,
const struct option *longopts,
int *longindex);
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中進行匹配。