getopt函式的使用和例項

2021-06-14 07:04:31 字數 4104 閱讀 6473

在  「-a a_arg -b b_arg -c」中,

選項:-a,-b,-c

引數:a_arg,b_arg

呼叫形式:

getopt(argc, argv,":ab::c")

找了一遍以後返回-1,因此最後總是會返回-1的。

a:   選項a後面有引數,可以用乙個或者多個空格隔開,也可以不用空格,緊跟著a。即   【-a  a_arg】       或者   【-aa_arg】

b::     b後面可以不跟引數,此時b後面用空格;也可以跟引數,此時引數要緊跟b。   即    【 -b 】 或者  【-bb_arg】

開頭有「:」時,處理更為只能,能夠區分無效選項和選項後面沒有引數這兩種情況。

getopt函式可以有效處理main函式的輸入引數。

以下這段話摘自網路:

getopt()每呼叫一次返回乙個選項。

argc 和 argv 很顯然就是 main 函式的兩個引數。

字串 optstring 可以包含下列元素:單個字元,字元後面接乙個冒號說明後面跟隨乙個選項引數,字元後面接兩個冒號說明後面跟隨乙個可有可無的選項引數。例如,乙個選項字元 "x" 表示選項 "-x" ,選項字元 "x:" 表示選項和其引數 "-x argument",選項字元 "x::" 表示選項 x 的引數是可選的(「::」 是 gnu 增加的,不一定在所有的unix 系統下都可以使用)。

getopt()的返回後,如果有選項引數的話 optarg 指向選項引數,並且變數 optind 包含下乙個 argv 引數作為對 getopt() 下一次呼叫的索引。變數 optopt 儲存最後乙個由 getopt() 返回的已知的選項。

當引數列已經到結尾時getopt()函式返回-1,當遇到乙個未知的選項時 getopt 返回'?'。引數列中選項的解釋可能會被'--'取消,由於它引起 getopt()給引數處理傳送結束訊號並返回-1。

很多時候,我們不希望輸出任何錯誤資訊,或更希望輸出自己定義的錯誤資訊。可以採用以下兩種方法來更改getopt()函式的出錯資訊輸出行為:

在呼叫getopt()之前,將opterr設定為0,這樣就可以在getopt()函式發現錯誤的時候強制它不輸出任何訊息。

如果optstring引數的第乙個字元是冒號,那麼getopt()函式就會保持沉默,並根據錯誤情況返回不同字元,如下:

「無效選項」 ―― getopt()返回'?',並且optopt包含了無效選項字元(這是正常的行為)。

「缺少選項引數」 ―― getopt()返回':',如果optstring的第乙個字元不是冒號,那麼getopt()返回'?',這會使得這種情況不能與無效選項的情況區分開。

例如optstring為:a:b::c,表示a帶乙個引數,b可選,c不帶引數

如果輸入d,「無效選項「,getopt返回'?'

如果輸入的a忘記帶引數,「缺少選項引數」,getopt應返':' ;如果不再optstring的第乙個字元不是':'的話,那麼將會把這個錯當成"無效引數",從而getopt返回'?';從而無法區別錯誤型別

ref:

**1

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

}printf("剩下的選項: %d, %s\n", optind, argv[optind]);

printf("引數的重排列:\n");

for(c=1; c

administrator@ubuntu:~/test/sys_v$ ./a -a a_arg -bb_arg -c c_arg -g -d

yes: -a a_arg

yes: -b b_arg

yes: -c (null)

無效選項: -g

選項缺少引數: -d

剩下的選項: 7, c_arg

引數的重排列:

1 : -a

2 : a_arg

3 : -bb_arg

4 : -c

5 : -g

6 : -d

7 : c_arg

administrator@ubuntu:~/test/sys_v$

(1)選項a需要引數,於是找到了引數a_arg

(2)選項b可以有引數也可以沒有,後面的東西緊跟著b,於是找到了引數b_arg

(3)選項c沒有引數,直接輸出。

(4)-g引數不存在,於是識別為無效選項。

(5)-d選項後面應該有引數的,這裡沒有引數,所以提示缺少引數。這裡-d放到了最後,如果放在前面,他就會把緊跟著的東西作為其引數。

(6)還有無人認領的引數c_arg,在重排列階段,無人認領的引數被放到最後。

將-bb_arg改為-b b_arg,將-g -d改為-d -g。則

(1)-b後面為空格,視為無引數,從而b_arg引數無人認領;

(2)-g被當作-d的引數。

administrator@ubuntu:~/test/sys_v$ ./a -a a_arg -b b_arg -c c_arg -g -d

yes: -a a_arg

yes: -b (null)

yes: -c (null)

無效選項: -g

選項缺少引數: -d

剩下的選項: 7, b_arg

引數的重排列:

1 : -a

2 : a_arg

3 : -b

4 : -c

5 : -g

6 : -d

7 : b_arg

8 : c_arg

administrator@ubuntu:~/test/sys_v$ ./a -a a_arg -b b_arg -c c_arg -d -g

yes: -a a_arg

yes: -b (null)

yes: -c (null)

yes: -d -g

剩下的選項: 7, b_arg

引數的重排列:

1 : -a

2 : a_arg

3 : -b

4 : -c

5 : -d

6 : -g

7 : b_arg

8 : c_arg

char *optstr = ":a:b::cd:e:";

改為 char *optstr = "a:b::cd:e:";  去掉了前面的冒號。這樣的話,

選項缺引數或者無效選項都會返回?,無法區分開,這兩者都會提示錯誤。

administrator@ubuntu:~/test/sys_v$ ./a -a a_arg -bb_arg -c c_arg -g -d

yes: -a a_arg

yes: -b b_arg

yes: -c (null)

./a: invalid option -- 'g'

無效選項: -g

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

無效選項: -d

剩下的選項: 7, c_arg

引數的重排列:

1 : -a

2 : a_arg

3 : -bb_arg

4 : -c

5 : -g

6 : -d

7 : c_arg

如果不想要錯誤,可以在呼叫getopt之前執行 opterr=0;去除。

int c;

opterr=0;

char *optstr = "a:b::cd:e:";

執行:

administrator@ubuntu:~/test/sys_v$ ./a -a a_arg -bb_arg -c c_arg -g -d

yes: -a a_arg

yes: -b b_arg

yes: -c (null)

無效選項: -g

無效選項: -d

剩下的選項: 7, c_arg

引數的重排列:

1 : -a

2 : a_arg

3 : -bb_arg

4 : -c

5 : -g

6 : -d

7 : c_arg

例項講解getopt 函式的使用

include include int main int argc,char argv printf optopt c n optopt 不在選項字串optstring中的選項。找不到引數的case 和缺少選項的case 的選項 函式說明 include extern char optarg ext...

getopt 函式的使用

每一天你都在使用大量的命令列程式,是不是感覺那些命令列引數用起來比較方便,他們都是使用getopt來實現的。在linux下使用getopt寫程式是一種比較方便的事情,下面來簡單的介紹一下getopt的使用。在討論引數處理之前,我們先明確兩個概念 選項 選項引數 gcc g o test test.c...

getopt函式的使用

include int getopt int argc,char const argv,const char optstring 這是getopt函式的原型 函式用來分析命令列引數,有三個引數,argc表示引數個數,argv表示引數內容,optstring表示可選選項,重點就在於optstring的...