HOWTO · C++

C++ で getopt を使用して引数を処理する

この記事では、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)を処理していることがわかります)。