標籤:
相關函數表標頭檔 #include<unistd.h>
定義函數 int getopt(int argc,char * const argv[ ],const char * optstring);
函數說明
該函數的argc和argv參數通常直接從main()的參數直接傳遞而來。optstring是選項字母組成的字串。如果該字串裡的任一字元後面有冒號,那麼這個選項就要求有選項參數。當給定getopt()命令參數的數量 (
argc)、指向這些參數的數組 (
argv) 和選項字串 (
optstring) 後,
getopt() 將返回第一個選項,並設定一些全域變數。使用相同的參數再次調用該函數時,它將返回下一個選項,並設定相應的全域變數。如果不再有可識別的選項,將返回
-1,此任務就完成了。
getopt() 所設定的全域變數包括:
char *optarg——當前選項參數字串(如果有)。
int optind——argv的當前索引值。當getopt()在while迴圈中使用時,迴圈結束後,剩下的字串視為運算元,在argv[optind]至argv[argc-1]中可以找到。
- int opterr——這個變數非零時,getopt()函數為“無效選項”和“缺少參數選項,並輸出其錯誤資訊。
int optopt——當發現無效選項字元之時,getopt()函數或返回‘?‘字元,或返回‘:‘字元,並且optopt包含了所發現的無效選項字元。
getopt()用來分析命令列參數。參數argc和argv是由main()傳遞的參數個數和內容。參數optstring 則代表欲處理的選項字串。此函數會返回在argv 中下一個的選項字母,此字母會對應參數optstring 中的字母。如果選項字串裡的字母后接著冒號“:”,則表示還有相關的參數,全域變數optarg 即會指向此額外參數。如果getopt()找不到符合的參數則會印出錯資訊,並將全域變數optopt設為“?”字元,如果不希望getopt()印出錯資訊,則只要將全域變數opterr設為0即可。
短參數的定義
getopt()使用optstring所指的字串作為短參數列表,象"1ac:d::"就是一個短參數列表。短參數的定義是一個‘-‘後面跟一個字母或數字,象-a, -b就是一個短參數。每個數字或字母定義一個參數。 其中短參數在getopt定義裡分為三種: 1. 不帶值的參數,它的定義即是參數本身。 2. 必須帶值的參數,它的定義是在參數本身後面再加一個冒號。 3. 可選值的參數,它的定義是在參數本身後面加兩個冒號 。 在這裡拿上面的"1ac:d::"作為範例進行說明,其中的1,a就是不帶值的參數,c是必須帶值的參數,d是可選值的參數。 在實際調用中,‘-1 -a -c cvalue -d‘, ‘-1 -a -c cvalue -ddvalue‘, ‘-1a -ddvalue -c cvalue‘都是合法的。這裡需要注意三點: 1. 不帶值的參數可以連寫,象1和a是不帶值的參數,它們可以-1 -a分開寫,也可以-1a或-a1連寫。 2. 參數不分先後順序,‘-1a -c cvalue -ddvalue‘和‘-d -c cvalue -a1‘的解析結果是一樣的。 3. 要注意可選值的參數的值與參數之間不能有空格,必須寫成-ddvalue這樣的格式,如果寫成-d dvalue這樣的格式就會解析錯誤。
返回值
getopt()每次調用會逐次返回命令列傳入的參數。 當沒有參數的最後的一次調用時,getopt()將返回-1。 當解析到一個不在optstring裡面的參數,或者一個必選值參數不帶值時,返回‘?‘。 當optstring是以‘:‘開頭時,缺值參數的情況下會返回‘:‘,而不是‘?‘ 。
如果不希望輸出任何錯誤資訊,或更希望輸出自訂的錯誤資訊。可以採用以下兩種方法來更改getopt()函數的出錯資訊輸出行為:
- 在調用getopt()之前,將opterr設定為0,這樣就可以在getopt()函數發現錯誤的時候強制它不輸出任何訊息。
- 如果optstring參數的第一個字元是冒號,那麼getopt()函數就會保持沉默,並根據錯誤情況返回不同字元,如下:
- “無效選項” —— getopt()返回‘?‘,並且optopt包含了無效選項字元(這是正常的行為)。
- “缺少選項參數” —— getopt()返回‘:‘,如果optstring的第一個字元不是冒號,那麼getopt()返回‘?‘,這會使得這種情況不能與無效選項的情況區分開。
舉例如下:
#include <stdio.h>#include <unistd.h>int main(int argc,char *argv[]){ int ch; opterr=0; while((ch=getopt(argc,argv,"a:b::cde"))!=-1) { printf("optind:%d\n",optind); printf("optarg:%s\n",optarg); printf("ch:%c\n",ch); switch(ch) { case 'a': printf("option a:'%s'\n",optarg); break; case 'b': printf("option b:'%s'\n",optarg); break; case 'c': printf("option c\n"); break; case 'd': printf("option d\n"); break; case 'e': printf("option e\n"); break; default: printf("other option:%c\n",ch); } printf("optopt+%c\n",optopt); }}
用gcc編譯後,在終端行執行以上的命令:./a.out -a1234 -b432 -c -d則會有如下的輸出:optind:2optarg:1234ch:aoption a:'1234'optopt+optind:3optarg:432ch:boption b:'432'optopt+optind:4optarg:(null)ch:coption coptopt+optind:5optarg:(null)ch:doption doptopt+
參考文獻:
http://vopit.blog.51cto.com/2400931/440453
http://blog.csdn.net/mr_jj_lian/article/details/6835137
C語言getopt()函數