getopt----解析main函式中的引數
轉自------ Linux下getopt()函式的簡單使用
"a:b:cd::e",這就是一個選項字串。對應到命令列就是-a ,-b ,-c ,-d, -e 。冒號又是什麼呢? 冒號表示引數,一個冒號就表示這個選項後面必須帶有引數(沒有帶引數會報錯哦),但是這個引數可以和選項連在一起寫,也可以用空格隔開,比如-a123 和-a 123(中間有空格) 都表示123是-a的引數;兩個冒號的就表示這個選項的引數是可選的,即可以有引數,也可以沒有引數,但要注意有引數時,引數與選項之間不能有空格(有空格會報錯的哦),這一點和一個冒號時是有區別的。
#include <unistd.h> #include <stdio.h> int main(int argc, char * argv[]) { int ch; printf("\n\n"); printf("optind:%d,opterr:%d\n",optind,opterr); printf("--------------------------\n"); while ((ch = getopt(argc, argv, "ab:c:de::")) != -1) { printf("optind: %d\n", optind); switch (ch) { case 'a': printf("HAVE option: -a\n\n"); break; case 'b': printf("HAVE option: -b\n"); printf("The argument of -b is %s\n\n", optarg); break; case 'c': printf("HAVE option: -c\n"); printf("The argument of -c is %s\n\n", optarg); break; case 'd': printf("HAVE option: -d\n"); break; case 'e': printf("HAVE option: -e\n"); printf("The argument of -e is %s\n\n", optarg); break; case '?': printf("Unknown option: %c\n",(char)optopt); break; } } }
編譯後命令行執行:# ./main -b "qing er"
輸出結果為:
optind:1,opterr:1
--------------------------
optind: 3
HAVE option: -b
The argument of -b is qing er
我們可以看到:optind和opterr的初始值都為1,前面提到過opterr非零表示產生的錯誤要輸出到stderr上。那麼optind的初值為什麼是1呢?
這就要涉及到main函式的那兩個引數了,argc表示引數的個數,argv[]表示每個引數字串,對於上面的輸出argc就為3,argv[]分別為: ./main 和 -b 和"qing er" ,實際上真正的引數是用第二個-b 開始,也就是argv[1],所以optind的初始值為1;
當執行getopt()函式時,會依次掃描每一個命令列引數(從下標1開始),第一個-b,是一個選項,而且這個選項在選項字串optstring中有,我們看到b後面有冒號,也就是b後面必須帶有引數,而"qing er"就是他的引數。所以這個命令列是符合要求的。至於執行後optind為什麼是3,這是因為optind是下一次進行選項搜尋的開始索引,也是說下一次getopt()函式要從argv[3]開始搜尋。當然,這個例子argv[3]已經沒有了,此時getopt()函式就會返回-1。