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選項後面的所以參數 了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章