標籤:style blog http color 使用 strong
getopt(分析命令列參數)
相關函數表標頭檔 #include<unistd.h>
定義函數 int getopt(int argc,char * const argv[ ],const char * optstring);
函數說明 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是以‘:‘開頭時,缺值參數的情況下會返回‘:‘,而不是‘?‘ 。 c.c檔案
1 #include <stdio.h> 2 #include <unistd.h> 3 4 int main(int argc, char **argv) 5 { 6 int ch; 7 opterr = 0; 8 while ((ch = getopt(argc,argv,"a:bcde::f"))!=-1) 9 {10 switch(ch)11 {12 case ‘a‘:13 printf("option a:‘%s‘\n",optarg);14 break;15 case ‘b‘:16 printf("option b :b\n");17 break;18 case ‘e‘:19 printf("option e:‘%s‘\n",optarg);20 break;21 default:22 printf("other option :%c\n",ch);23 }24 }25 printf("optopt +%c\n",optopt);26 27 return 1;28 }
運行結果:
1 ~ Home$ ./c -a 2 other option :? 3 optopt +a 4 ~ Home$ ./c -a 123 5 option a:‘123‘ 6 optopt +a 7 ~ Home$ ./c -a123 8 option a:‘123‘ 9 optopt +a10 ~ Home$ ./c -b11 option b :b12 optopt +b13 ~ Home$ ./c -cde14 other option :c15 other option :d16 other option :?17 optopt +e18 ~ Home$ ./c -e19 other option :?20 optopt +e21 ~ Home$ ./c -e12322 option e:‘123‘23 optopt +e24 ~ Home$ ./c -e 45625 option e:‘456‘26 optopt +e27 ~ Home$ ./c -f28 other option :f29 optopt +f30 ~ Home$ ./c -a 123 -bcdf -e 45631 option a:‘123‘32 option b :b33 other option :c34 other option :d35 other option :f36 option e:‘456‘37 optopt +e
reference:
http://vopit.blog.51cto.com/2400931/440453