C語言中getopt()函數的用法

1.getopt()函數

getopt函數用來解析命令行選項,聲明所在頭文件爲:

#include <unistd.h>

函數原型如下:

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

第一個參數argc是參數個數,和main函數的argc一樣;

第二個參數argv是字符串指針,和main函數的argv一樣;

第三個參數 optstring 是選項字符串,是本文所要講述的重點。

2. optstring

選項字符串的內容如下:

  • 字符代表一個選項;
  • 沒有冒號就表示純選項,不需要參數;
  • 一個冒號代表該選項之後必須帶有參數,可以使用空格,也可以不使用;
  • 兩個冒號代表該項之後的參數可寫可不寫;

還有一些錯誤處理:

針對字符後無冒號的設定:

  • 不加空格帶上參數後,會解析爲這個兩個獨立選項合併;
  • 加上空格帶上參數,會只解析出選項,忽略參數。

針對字符後一個冒號的設定:

  • 帶上空格多加幾個參數後,只解析第一個,其餘忽略;
  • 如果不加參數,解析失敗;

比如,"vha:b:c::"就表示:

  • 支持-v選項,通常用於打印版本號;
  • 支持-h選項,通常用於打印幫助信息;
  • 支持-a選項,後面必須帶有一個參數;
  • 支持-b選項,後面必須帶有一個參數;
  • 支持-c選項,後面可以帶參數,也可以不用帶參數;

3. 使用的全局變量

使用該函數時,會用到/設置四個全局變量:

extern char* optarg;

extern int optind;

extern int opterr;

extern int optopt;
  • optarg:用來保存選項的參數;
  • optind:用來記錄下一個檢索位置;
  • opterr:用來表示是否將錯誤信息輸出到stderr;
  • optopt:表示不在選項字符串optstring中的選項;

4. 示例程序

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

int main(int argc, char * argv[])
{
    
    int ch;

    printf("初始值:optind = %d,opterr = %d\n", optind, opterr);

    while ((ch = getopt(argc, argv, "vha:b:c::")) != -1)
    {
        printf("開始解析參數:optind = %d\n", optind);
        switch (ch) 
        {
                case 'v':
                        printf("捕獲到選項: -v\n");
                        printf("系統版本v1.1.0\n");   
                        break;
                case 'h':
                        printf("捕獲到選項: -h\n"); 
                        printf("用法示例: -a 1 -b 2 -c [\"hello\"]\n");
                        break;
                case 'a':
                        printf("捕獲到選項: -a\n");
                        printf("該選項參數爲:%s\n\n", optarg);
                        break;
                case 'b':
                        printf("捕獲到選項: -b\n");
                        printf("該選項參數爲:%s\n\n", optarg);
                        break;
                case 'c':
                        printf("捕獲到選項: -c\n");
                        printf("該選項參數爲:%s\n\n", optarg);
                        break;
        }
    }
}

使用gcc編譯:

gcc getopt_test.c -o getopt_test.o

單獨測試每個選項:




測試都沒有問題,接下來再看看幾種錯誤的情況:

比如 -v 選項不需要參數,帶個參數的結果如下:

再比如-a選項明確需要帶一個參數,則帶兩個參數的結果如下:

如果不加參數,結果如下:

最後演示一個綜合示例:

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