1. 程式人生 > >getopt()函式獲取兩個以上引數的方法

getopt()函式獲取兩個以上引數的方法

最近一直在Linux下寫程式,命令列引數一般都是手動寫程式分析處理,特別麻煩而求程式碼也很亂。最近發現有getopt()可以幫助進行引數分析,方便了很多。但是發現一個問題,getopt()每個選項只能用optarg獲得一個引數,要是想要獲得兩個以上的引數就沒辦法了。在網上查了以下也沒有什麼特別好的辦法。雖然getopt_long()可以獲得多個引數,但是這個函式需要的引數太多了,不喜歡用。後來看了以下getopt的介紹自己想出了一個辦法,看著還不錯。分享1下,如果你也想到了這種方法,純屬有緣哈。

先粘上getopt的介紹,獲取兩個以上引數的方法寫在後面。

函式說明 getopt()用來分析命令列

引數。引數argc和argv分別代表引數個數和內容,跟main()函式的命令列引數是一樣的。引數 optstring為選項字串, 告知 getopt()可以處理哪個選項以及哪個選項需要引數,如果選項字串裡的字母后接著冒號“:”,則表示還有相關的引數,全域變數optarg 即會指向此額外引數。如果在處理期間遇到了不符合optstring指定的其他選項getopt()將顯示一個錯誤訊息,並將全域變數optarg設為“?”字元,如果不希望getopt()打印出錯資訊,則只要將全域變數opterr設為0即可。

標頭檔案 #include<unistd.h> 定義函式 int getopt(int argc,char * const argv[ ],const char * optstring); extern char *optarg; extern int optind, opterr, optopt; getopt() 所設定的全域性變數包括: optarg——指向當前選項引數(如果有)的
指標
。 optind——再次呼叫 getopt() 時的下一個 argv 指標的索引。 optopt——最後一個未知選項。 optstring中的指定的內容的意義(例如getopt(argc, argv, "ab:c:de::");) 1.單個字元,表示選項,(如上例中的abcde各為一個選項) 2.單個字元後接一個冒號:表示該選項後必須跟一個引數。引數緊跟在選項後或者以空格隔開。該引數的指標賦給optarg。(如上例中的b:c:) 3 單個字元後跟兩個冒號,表示該選項後可以跟一個引數,也可以不跟。如果跟一個引數,引數必須緊跟在選項後不能以空格隔開。該引數的指標賦給optarg。(如上例中的e::,如果沒有跟引數,則optarg = NULL)
關鍵在於這裡的optind這個變數,它指向了下一個argv 指標的索引。舉個例子:
#include <stdio.h>
  #include<unistd.h>
  int main(int argc, char *argv[])
  {
  int ch;char *seg;
  while((ch = getopt(argc,argv,"a:"))!= -1)
  {
  switch(ch)
  {
  case 'a': seg=optarg; break;
  default: printf("unrecongnized option :%c\n",ch);
  }
  printf("option's seg:  +%s\n",seg);
  }
  return 0;
  }


假如我們的程式名叫main,那麼執行一下:main -a aa bb cc
我們可以很容易用oprarg變數得到第一個引數aa,而後面的引數bb cc 甚至dd ee ff怎麼辦呢?

#include <stdio.h>
  #include<unistd.h>
  int main(int argc, char *argv[])
  {
  int ch;
    char *seg1,*seg2,*seg3;
  while((ch = getopt(argc,argv,"a:"))!= -1)
  {
  switch(ch)
  {
  case 'a': 
{
seg1=optarg;
seg2=argv[optind];
seg3=argv[optind+1];
}; break;
  default: printf("unrecongnized option :%c\n",ch);
  }
  printf("option's seg1:  +%s\n",seg1);
printf("option's seg2:  +%s\n",seg2);
printf("option's seg3:  +%s\n",seg3);
  }  return 0;  }


還是執行一下:main -a aa bb cc 這樣,通過argv[optind+n]就可以得到某個選項後面任意多個引數了。注意,進入case a:子句的時候,optind的值為-a下一個引數的序號,也就是aa的序號2,那麼argv[2]正好就是aa,argv[3]正好就是bb,argv[4]就是cc。。。以此類推就可以得到-a選項後面的所以引數 了。