命令行處理函數getopt的使用方法

        日常開發中,會經常對命令行參數進行處理,當參數比較少的時候,可以手動處理,但是當參數過多的時候就要使用getopt來處理了。

int getopt(int argc, char * const argv[],
           const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;

getopt() 所設置的全局變量包括:

        optarg——指向當前選項參數(如果有)的指針

        optind——再次調用 getopt() 時的下一個argv指針的索引,即表示的是下一個將被處理到的參數在argv中的下標值。

        optopt——最後一個未知選項。

        opterr——如果指定此值爲0,getopt、getopt_long、getopt_long_only遇到錯誤將不會輸出錯誤信息到標準輸出流。

        從最簡單的getopt講起,getopt函數的前兩個參數,就是main函數的argc和argv,這兩者直接傳入即可,要考慮的就只剩下第三個參數。

        optstring字符串的意義如下:比如:getopt(argc, argv, "ab:c:de::");

        1.單個字符,表示選項(如下例中的abcde各爲一個選項)。比如:./a.out -a

        2.單個字符後接一個冒號:表示該選項後必須跟一個參數。參數緊跟在選項後或者以空格隔開。該參數的指針賦給optarg(如下例中的b:c:)。比如:./a.out -b zhang

        3 單個字符後跟兩個冒號,表示該選項後可以跟一個參數,也可以不跟。如果跟一個參數,參數必須緊跟在選項後不能以空格隔開。該參數的指針賦給optarg。(如上例中的e::,如果沒有跟參數,則optarg = NULL)。./a.out -ezhang

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

        -mnbn相當於-m -n -b n

#include <stdio.h>
#include <unistd.h>
#include <getopt.h>

int getopt(int argc, char * const argv[],
           const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;

int main(int argc, char *argv[])
{
    int opt;
    char *optstring = "ab:c::d:";
//    opterr = 0;

    while ((opt = getopt(argc, argv, optstring)) != -1)
    {
        printf("opt = %c\n", opt);
        printf("optarg = %s\n", optarg);
        printf("optind = %d\n", optind);
        printf("argv[optind - 1] = %s\n",  argv[optind - 1]);
        printf("optopt = %c\n", optopt);
    }

    return 0;
}

程序運行結果爲:

下一篇:命令行處理函數getopt_long的使用方法

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