1. 程式人生 > >命令列引數的獲取

命令列引數的獲取

時不時我們會遇到對命令含引數的處理,如果引數個數較多,按照順序處理有可能會出現錯誤或者一些可選引數將不能實現,接下來介紹幾個處理命令列引數的函式

  • 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中進行匹配。