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