C++
 Computer >> コンピューター >  >> プログラミング >> C++

C言語のgetopt()関数を使ったコマンドライン引数の解析方法

getopt()は、コマンドラインオプションを受け取るために用意されているC言語の標準関数の一つです。プログラムに渡された引数の中から、-i-f ファイル名のようなオプション指定を簡単に取り出すことができます。

getopt()関数の構文

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

各引数の意味は以下の通りです。

  • argc: main関数に渡された引数の総数
  • argv: 引数文字列の配列
  • optstring: オプションとして受け付ける文字のリスト。1文字が1つのオプションに対応します

戻り値とグローバル変数

getopt()関数は、状況に応じてさまざまな値を返します。また、解析結果はいくつかのグローバル変数にも格納されます。

  • オプションが値(引数)を必要とする場合、その値へのポインタがoptargに格納されます。
  • 処理すべきオプションがなくなると-1を返します。
  • 認識できないオプションが見つかった場合は'?'を返し、その不明なオプション文字はoptoptに保存されます。
  • オプション自体は存在するのに必要な値が指定されていない場合も、通常は'?'が返されます。しかし、optstringの先頭に':'を置くことで、この場合に':'を返すように動作を変更できます。これにより、「未知のオプション」と「値の欠落」を区別できるようになります。

サンプルコード

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

main(int argc, char *argv[]) {
    int option;
    // 文字列の先頭に':'を置き、'?'と':'をコンパイラが区別できるようにする
    while((option = getopt(argc, argv, ":if:lrx")) != -1){ // getopt()からオプションを取得
        switch(option){
            // オプション i、r、l の場合は、それらがオプションであることを表示
            case 'i':
            case 'l':
            case 'r':
                printf("Given Option: %c\n", option);
                break;
            case 'f': // fはファイル名の指定に使用
                printf("Given File: %s\n", optarg);
                break;
            case ':':
                printf("option needs a value\n");
                break;
            case '?': // 未知のオプションに対応
                printf("unknown option: %c\n", optopt);
                break;
        }
    }
    for(; optind < argc; optind++){ // 余分な引数が渡された場合
        printf("Given extra arguments: %s\n", argv[optind]);
    }
}

実行例

上記のプログラムを、たとえば次のように実行した場合:

./a.out -i -f test_file.c -l -r hello

出力は以下のようになります。

Given Option: i
Given File: test_file.c
Given Option: l
Given Option: r
Given extra arguments: hello

ポイントまとめ

  • optstring内でオプション文字の後に':'を付けると、そのオプションは値を必須とする扱いになります(例:"if:lrx"f:)。
  • optindはgetopt()が次に処理するargvのインデックスを保持しており、ループ終了後は残りの非オプション引数(ここでは「hello」)を参照できます。
  • 先頭の':'により、値が不足している場合は'?'ではなく':'が返されるため、エラー処理をより細かく制御できます。

  1. JavaScriptのDate.parse()関数とは?日付文字列をミリ秒に変換する方法を解説

    Dateオブジェクトは、JavaScript言語に標準で組み込まれているデータ型です。Dateオブジェクトは、new Date() を使って次のように生成します。Dateオブジェクトを一度作成すれば、さまざまなメソッドを使って操作できるようになります。多くのメソッドは、ローカル時間またはUTC(協定世界時/グリニッジ標準時)のいずれかの時刻基準をもとに、年・月・日・時・分・秒・ミリ秒といった各フィールドの値を取得(get)したり設定(set)したりするために使用されます。parse() 関数は、文字列形式で与えられた日付を受け取り、それを解析したうえで、1970年1月1日00:00:00 UT

  2. JavaScriptのパラメータ(仮引数)と引数(実引数)の違いをわかりやすく解説

    パラメータと引数とは?JavaScriptにおいて、パラメータ(仮引数)とは、関数を定義するときに関数名の後ろの括弧内に記述される変数名のことです。一方、引数(実引数)とは、関数を呼び出すときに実際に渡される値であり、関数側で受け取られるものです。イメージとしては、パラメータは値を受け取るための「受け皿」のような名前で、引数はその受け皿に渡される「実際の値」です。この2つの違いを正しく理解することは、関数を使いこなすうえで非常に重要です。サンプルコード以下は、JavaScriptにおけるパラメータと引数の動作を確認できるコード例です。ボタンをクリックすると、配列の要素が引数として関数に渡され、