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 文字の長さのオプションを表します。

入力内のすべての処理が完了すると、関数は -1 を返します。

getopt() 関数は ? を返します認識できない何かに遭遇したとき。さらに、この認識されないオプションは、外部変数 optopt に格納されます。

デフォルトでは、オプションに値が必要な場合、たとえば、この場合、オプション f には入力値が必要なので、getopt()? を返します。しかし、optstring の最初の文字にコロン (:) を置くことで、? の代わりに : を返すようになります。

この場合、as、または d の入力を入力すると、オプション自体が返され、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 フラグの後に指定されたファイル名も報告され、オプション i および y? に入りました。カテゴリであり、不明なコマンドとして認識されました。

ここでは、上記のシナリオに加えて、getopt() 関数の後に追加した最後のループが、関数によって処理されなかった残りの引数(testingstring および not_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