Linux C 命令列引數解析

2021-10-03 07:33:39 字數 2991 閱讀 6217

為了提高程式的靈活性,我們常常需要在啟動程式時指定引數。比如,我們man ls看一下ls的官方介紹文件:

長引數與後面的值可以加空格,也可以用=號連線。如–byte 3 和–byte=3是相同的。

如果我們想實現這個引數解析功能,需要用到這個標頭檔案。主要提供了:

乙個結構體:

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指向的資料的值。

三個函式:

1.int getopt (int argc, char *const *ar**, const char *shortopts)

- argc和ar**就是從main函式中傳遞過來的。

- 如果shortopts="abcd:",getopt函式將依次檢查命令列是否指定了 -a, -b, -c及 -d

(這需要多次呼叫getopt函式,直到其返回-1),當檢查到上面某乙個引數被指定時,函式會返回

被指定的引數名稱(即該字母)。最後乙個引數d後面帶有冒號,: 表示引數d是可以指定值的,

如 -d 100 或 -d user.

2.int getopt_long (int argc, char *const *ar**,

const char *shortopts,

const struct option *longopts, int *longind)

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

const char *shortopts,

const struct option *longopts, int *longind)

- longopts指向的是乙個由option結構體組成的陣列。

- longind記錄當前找到引數符合longopts裡的第幾個元素的描述,即是longopts的下標值。

四個全域性變數:

char *optarg; 指向當前解析的引數。

int optind; 下乙個將被處理到的引數在ar**中的下標值。

int opterr; 如果opterr = 0,在getopt、getopt_long、getopt_long_only遇到錯

誤將不會輸出錯誤資訊到標準輸出流。 opterr在非0時,向螢幕輸出錯誤。

int optopt; 當命令列選項字元不包括在optstring中或者選項缺少必要的引數時,

該選項儲存在optopt中,getopt返回'?』

#include

#include

#include

intmain

(int argc,

char

*ar**)

return0;

}

執行結果如下:

}執行結果如下:

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

返回值:

(1)如果短選項找到,那麼將返回短選項對應的字元。

(2)如果長選項找到,如果flag為null,返回val。如果flag不為空,返回0

(3)如果遇到乙個選項沒有在短字元、長字元裡面。或者在長字元裡面存在二義性的,返回「?」

(4)如果解析完所有字元沒有找到(一般是輸入命令引數格式錯誤,eg: 連橫槓都沒有加的選項),返回「-1」

(5)如果選項需要引數,忘了新增引數。返回值取決於optstring,如果其第乙個字元是「:」,則返回「:」,否則返回「?」。

注意:

(1)longopts的最後乙個元素必須是全0填充,否則會報段錯誤

(2)短選項中每個選項都是唯一的。而長選項如果簡寫,也需要保持唯一性。

解析命令列引數

include include include include int make argv const char astr,const char delimiters,char argvp void free argv char argvp int main int argc,char argv i...

linux c開發 處理命令列引數

在linux c語言開發時,可使用getopt long獲取命令列引數,這個方法同時支援短選項和長選項,比較方便。因為選項可以帶引數,為了不和命令列引數混淆,這裡命令列引數稱為選項 邊看 邊做分析 include include 需要包括此標頭檔案 values for long options 長...

Boost 解析命令列引數

boost中有乙個program options庫,專門用來解析程式命令列引數的。allow long 接受長名稱 allow short 接受短名稱 allow dash for short 允許短選項使用 allow slash for short 允許短選項使用 long allow adja...