在 C++ 中使用 getopt 處理引數

Muhammad Husnain 2023年10月12日
在 C++ 中使用 getopt 處理引數

本文演示瞭如何使用 getopt() 函式來處理命令列中傳遞給程式碼的引數。本教程還解釋瞭如何操作程式碼以執行特定輸入的某些操作。

在 C++ 中使用 getopt() 函式處理引數

假設我們有如下所示的程式碼。

// File titled arg_test.cpp
#include <stdio.h>
#include <unistd.h>

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

  while ((opt = getopt(argc, argv, ":f:asd")) != -1) {
    if (opt == 'a' || opt == 's' || opt == 'd') {
      printf("Option Selected is: %c\n", opt);
    } else if (opt == 'f') {
      printf("Filename entered is: %s\n", optarg);
    } else if (opt == ':') {
      printf("Option requires a value \n");
    } else if (opt == '?') {
      printf("Unknown option: %c\n", optopt);
    }
  }

  // optind is for the extra arguments that are not parsed by the program
  for (; optind < argc; optind++) {
    printf("Extra arguments, not parsed: %s\n", argv[optind]);
  }

  return 0;
}

getopt() 函式的語法如下:

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

argc 是一個整數,argv 是一個字元陣列。optstring 是一個字元列表,每個字元代表一個單個字元長的選項。

該函式在處理完輸入中的所有內容後返回 -1

getopt() 函式在遇到它不認識的東西時返回 ?。此外,這個無法識別的選項儲存在外部變數 optopt 中。

預設情況下,如果選項需要一個值,例如,在我們的例子中,選項 f 需要一個輸入值,所以 getopt() 將返回 ?。但是,通過將冒號 (:) 作為 optstring 的第一個字元,該函式返回: 而不是 ?

在我們的例子中,輸入 asd 應該返回選項本身,使用 f 應該返回作為引數提供的檔名,其他所有內容都不應被視為有效選項。

要執行上述程式碼,你可以在終端中使用類似的命令:

gcc arg_test.cpp && ./a.out

當然,僅僅輸入這個不會給你任何有用的輸出。我們將輸入一個示例用例和一個示例輸出,並解釋如何處理每個命令。

如果我們輸入以下命令作為示例:

gcc arg_test.cpp && ./a.out -f filename.txt -i -y -a -d testingstring not_an_option

我們將得到以下輸出:

Filename entered is: filename.txt
Unknown option: i
Unknown option: y
Option Selected is: a
Option Selected is: d
Extra arguments, not parsed: testingstring
Extra arguments, not parsed: not_an_option

選項 ad 按預期返回。f 標誌後給出的檔名也被報告,選項 iy 進入 ? 類別並被識別為未知命令。

在這裡,我們可以看到除了上述場景之外,我們在 getopt() 函式之後新增的最後一個迴圈處理了該函式未處理的剩餘引數(testingstringnot_an_option,在我們的例子中)。

Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn

相關文章 - C++ Function