C語言getopt()函數

來源:互聯網
上載者:User

標籤:

相關函數表標頭檔         #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()函數的出錯資訊輸出行為:
  1. 在調用getopt()之前,將opterr設定為0,這樣就可以在getopt()函數發現錯誤的時候強制它不輸出任何訊息。
  2. 如果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()函數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.