在 「-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的...