【C言語】コマンドライン引数を複数受け取るためのテクニック

この記事では、C言語プログラムでコマンドライン引数から複数のオプションを受け取り、それぞれのオプションに対して適切な処理を行う方法を解説します。

目次から探す

単一のオプションを受け取る方法

コマンドライン引数を使ってプログラムにオプションを渡すことは、C言語プログラミングにおいて非常に一般的な手法です。

単一のオプションを受け取る方法として、以下の2つの方法があります。

getopt関数を使った方法

getopt関数は、C言語の標準ライブラリに含まれている関数で、コマンドライン引数からオプションを解析するために使用されます。

getopt関数を使うと、簡単にオプションの解析ができます。

#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
    int opt;
    while ((opt = getopt(argc, argv, "abc")) != -1) {
        switch (opt) {
            case 'a':
                printf("オプション -a が指定されました\n");
                break;
            case 'b':
                printf("オプション -b が指定されました\n");
                break;
            case 'c':
                printf("オプション -c が指定されました\n");
                break;
            default:
                printf("無効なオプションです\n");
                break;
        }
    }
    return 0;
}

上記のサンプルコードでは、getopt関数を使ってオプションを解析しています。

getopt関数の第2引数には、コマンドライン引数の配列argvを指定し、第3引数にはオプションの文字列を指定します。

オプションの文字列は、解析したいオプションを1文字ずつ指定します。

例えば、abcと指定すると、-a-b-cの3つのオプションを解析することができます。

argcとargvを使った方法

もう一つの方法として、argcargvを使ってオプションを解析する方法があります。

argcはコマンドライン引数の数を表し、argvはコマンドライン引数の配列を表します。

#include <stdio.h>
int main(int argc, char *argv[]) {
    int i;
    for (i = 1; i < argc; i++) {
        if (argv[i][0] == '-') {
            switch (argv[i][1]) {
                case 'a':
                    printf("オプション -a が指定されました\n");
                    break;
                case 'b':
                    printf("オプション -b が指定されました\n");
                    break;
                case 'c':
                    printf("オプション -c が指定されました\n");
                    break;
                default:
                    printf("無効なオプションです\n");
                    break;
            }
        }
    }
    return 0;
}

上記のサンプルコードでは、argcargvを使ってオプションを解析しています。

argvの各要素をループで処理し、先頭が'-'である場合にオプションとして解析します。

オプションの2文字目をswitch文で判定し、対応する処理を行います。

複数のオプションを受け取る方法

単一のオプションだけでなく、複数のオプションを受け取る方法もあります。

以下の2つの方法が一般的です。

フラグを使った方法

フラグを使う方法では、各オプションに対応するフラグ変数を用意し、オプションが指定された場合にフラグを立てるという方法です。

#include <stdio.h>
int main(int argc, char *argv[]) {
    int flag_a = 0;
    int flag_b = 0;
    int flag_c = 0;
    int i;
    for (i = 1; i < argc; i++) {
        if (argv[i][0] == '-') {
            switch (argv[i][1]) {
                case 'a':
                    flag_a = 1;
                    break;
                case 'b':
                    flag_b = 1;
                    break;
                case 'c':
                    flag_c = 1;
                    break;
                default:
                    printf("無効なオプションです\n");
                    break;
            }
        }
    }
    if (flag_a) {
        printf("オプション -a が指定されました\n");
    }
    if (flag_b) {
        printf("オプション -b が指定されました\n");
    }
    if (flag_c) {
        printf("オプション -c が指定されました\n");
    }
    return 0;
}

上記のサンプルコードでは、各オプションに対応するフラグ変数flag_aflag_bflag_cを用意し、オプションが指定された場合に対応するフラグを立てています。

最後に、各フラグの状態に応じて処理を行います。

オプションの値を配列で管理する方法

オプションに値を指定する場合、値を配列で管理する方法もあります。

例えば、-fオプションに対してファイル名を指定する場合、複数のファイル名を受け取るために配列を使うことができます。

#include <stdio.h>
#define MAX_FILES 10
int main(int argc, char *argv[]) {
    char files[MAX_FILES][256];
    int file_count = 0;
    int i;
    for (i = 1; i < argc; i++) {
        if (argv[i][0] == '-') {
            switch (argv[i][1]) {
                case 'f':
                    if (i + 1 < argc) {
                        i++;
                        strcpy(files[file_count], argv[i]);
                        file_count++;
                    } else {
                        printf("オプション -f の引数がありません\n");
                    }
                    break;
                default:
                    printf("無効なオプションです\n");
                    break;
            }
        }
    }
    printf("指定されたファイル名:\n");
    for (i = 0; i < file_count; i++) {
        printf("%s\n", files[i]);
    }
    return 0;
}

上記のサンプルコードでは、-fオプションに対してファイル名を指定する場合を考えています。

filesという2次元配列を用意し、オプションが指定された場合にその値を配列に格納します。

最後に、配列に格納された値を表示します。

これらの方法を使うことで、C言語プログラムでコマンドライン引数から複数のオプションを受け取り、適切な処理を行うことができます。

目次から探す