命令行選項解析函數:getopt()

1、定義

int getopt(int argc, char * const argv[], const char *optstring);

2、描述

getopt是用來解析命令行選項參數的,但是隻能解析短選項: -d 100,不能解析長選項:--prefix

3、參數

argc:main()函數傳遞過來的參數的個數
argv:main()函數傳遞過來的參數的字符串指針數組
optstring:選項字符串,告知 getopt()可以處理哪個選項以及哪個選項需要參數

4、返回

如果選項成功找到,返回選項字母;如果所有命令行選項都解析完畢,返回 -1;如果遇到選項字符不在 optstring 中,返回字符 '?';如果遇到丟失參數,那麼返回值依賴於 optstring 中第一個字符,如果第一個字符是 ':' 則返回':',否則返回'?'並提示出錯誤信息。

5、下邊重點舉例說明optstring的格式意義:

char*optstring = “ab:c::”;
單個字符a         表示選項a沒有參數            格式:-a即可,不加參數
單字符加冒號b:     表示選項b有且必須加參數      格式:-b 100或-b100,但-b=100錯
單字符加2冒號c::   表示選項c可以有,也可以無     格式:-c200,其它格式錯誤

上面這個 optstring 在傳入之後,getopt 函數將依次檢查命令行是否指定了 -a, -b, -c(這需要多次調用 getopt 函數,直到其返回-1),當檢查到上面某一個參數被指定時,函數會返回被指定的參數名稱(即該字母)

optarg —— 指向當前選項參數(如果有)的指針。
optind —— 再次調用 getopt() 時的下一個 argv指針的索引。
optopt —— 最後一個未知選項。
opterr ­—— 如果不希望getopt()打印出錯信息,則只要將全域變量opterr設爲0即可。

以上描述的並不生動,下邊結合實例來理解:

6、實例:

 

 

#include<stdio.h>
#include<unistd.h>
#include<getopt.h>
int main(intargc, char *argv[])
{
    int opt;
    char *string = "a::b:c:d";
    while ((opt = getopt(argc, argv, string))!= -1)
    {  
        printf("opt = %c\t\t", opt);
        printf("optarg = %s\t\t",optarg);
        printf("optind = %d\t\t",optind);
        printf("argv[optind] = %s\n",argv[optind]);
    }  
}

 

編譯上述程序並執行結果:

輸入選項及參數正確的情況

dzlab:~/test/test#./opt -a100 -b 200 -c 300 -d
opt = a         optarg = 100            optind = 2              argv[optind] = -b
opt = b         optarg = 200            optind = 4              argv[optind] = -c
opt = c         optarg = 300            optind = 6              argv[optind] = -d
opt = d         optarg = (null)         optind = 7              argv[optind] = (null)

或者這樣的選項格式(注意區別):

dzlab:~/test/test#./opt -a100 -b200 -c300 -d 
opt = a         optarg = 100            optind = 2              argv[optind] = -b200
opt = b         optarg = 200            optind = 3              argv[optind] = -c300
opt = c         optarg = 300            optind = 4              argv[optind] = -d
opt = d         optarg = (null)         optind = 5              argv[optind] = (null)

選項a是可選參數,這裏不帶參數也是正確的

dzlab:~/test/test#./opt -a -b 200 -c 300 -d   
opt = a         optarg = (null)         optind = 2              argv[optind] = -b
opt = b         optarg = 200            optind = 4              argv[optind] = -c
opt = c         optarg = 300            optind = 6              argv[optind] = -d
opt = d         optarg = (null)         optind = 7              argv[optind] = (null)

輸入選項參數錯誤的情況

dzlab:~/test/test#./opt -a 100 -b 200 -c 300 -d
opt = a         optarg = (null)         optind = 2              argv[optind] = 100
opt = b         optarg = 200            optind = 5              argv[optind] = -c
opt = c         optarg = 300            optind = 7              argv[optind] = -d
opt = d         optarg = (null)         optind = 8              argv[optind] = (null)

導致解析錯誤,第一個 optarg = null,實際輸入參數 100,由於格式不正確造成的(可選參數格式固定)

參數丟失,也會導致錯誤,c選項是必須有參數的,不加參數提示錯誤如下:

dzlab:~/test/test#./opt -a -b 200 -c      
opt = a         optarg = (null)         optind = 2              argv[optind] = -b
opt = b         optarg = 200            optind = 4              argv[optind] = -c
./opt: optionrequires an argument -- 'c'
opt = ?         optarg = (null)         optind = 5              argv[optind] = (null)

這種情況,optstring 中第一個字母不是':',如果在 optstring 中第一個字母加':',則最後丟失參數的那個選項 opt 返回的是':',不是'?',並且沒有提示錯誤信息,這裏不再列出。

命令行選項未定義,-e選項未在optstring中定義,會報錯:

dzlab:~/test/test#./opt -a -b 200 -e
opt = a         optarg = (null)         optind = 2              argv[optind] = -b
opt = b         optarg = 200             optind = 4              argv[optind] = -e
./opt: invalidoption -- 'e'
opt = ?         optarg = (null)         optind = 5              argv[optind] = (null)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章