関数

[C言語] コマンドライン引数の文字列を比較して処理を分岐させる方法

C言語では、プログラムの実行時にコマンドライン引数を受け取ることができます。これにより、プログラムの動作を外部から制御することが可能です。

コマンドライン引数は、通常、main関数の引数としてargcargvを使用して取得します。argvは文字列の配列で、各要素が引数を表します。

文字列の比較にはstrcmp関数を使用します。この関数は、二つの文字列を比較し、同じであれば0を返します。

この機能を活用することで、特定の引数に基づいてプログラムの処理を分岐させることができます。

コマンドライン引数の処理

C言語では、プログラムを実行する際にコマンドライン引数を受け取ることができます。

これにより、プログラムの動作を柔軟に変更することが可能です。

ここでは、コマンドライン引数の数を確認し、内容を表示し、条件に応じて処理を分岐させる方法について解説します。

引数の数を確認する

コマンドライン引数の数は、main関数の引数として渡されるargcで確認できます。

argcは、プログラム名を含む引数の総数を表します。

#include <stdio.h>
int main(int argc, char *argv[]) {
    // 引数の数を表示
    printf("引数の数: %d\n", argc);
    return 0;
}
$ ./program arg1 arg2
引数の数: 3

この例では、プログラム名を含めて3つの引数が渡されています。

引数の内容を表示する

引数の内容は、argv配列を使ってアクセスできます。

argv[0]はプログラム名を指し、argv[1]以降が実際の引数です。

#include <stdio.h>
int main(int argc, char *argv[]) {
    for (int i = 0; i < argc; i++) {
        // 各引数の内容を表示
        printf("引数%d: %s\n", i, argv[i]);
    }
    return 0;
}
$ ./program arg1 arg2
引数0: ./program
引数1: arg1
引数2: arg2

このプログラムは、すべての引数を順番に表示します。

引数を条件に処理を分岐させる

引数の内容に基づいてプログラムの処理を分岐させることができます。

strcmp関数を使って文字列を比較し、条件に応じた処理を行います。

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
    if (argc > 1) {
        // 引数が"start"の場合の処理
        if (strcmp(argv[1], "start") == 0) {
            printf("プログラムを開始します。\n");
        }
        // 引数が"stop"の場合の処理
        else if (strcmp(argv[1], "stop") == 0) {
            printf("プログラムを停止します。\n");
        }
        // その他の引数の場合
        else {
            printf("不明なコマンド: %s\n", argv[1]);
        }
    } else {
        printf("引数が指定されていません。\n");
    }
    return 0;
}
$ ./program start
プログラムを開始します。
$ ./program stop
プログラムを停止します。
$ ./program unknown
不明なコマンド: unknown

このプログラムは、引数に応じて異なるメッセージを表示します。

引数が指定されていない場合は、その旨を通知します。

実践例:コマンドライン引数による処理分岐

コマンドライン引数を利用することで、プログラムの動作を柔軟に制御することができます。

ここでは、引数に応じたメッセージの表示、ファイル操作、設定変更の実践例を紹介します。

引数に応じたメッセージの表示

引数に基づいて異なるメッセージを表示するプログラムを作成します。

これは、ユーザーの入力に応じてプログラムの動作を変える基本的な方法です。

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
    if (argc > 1) {
        if (strcmp(argv[1], "hello") == 0) {
            printf("こんにちは!\n");
        } else if (strcmp(argv[1], "goodbye") == 0) {
            printf("さようなら!\n");
        } else {
            printf("不明なメッセージ: %s\n", argv[1]);
        }
    } else {
        printf("引数が指定されていません。\n");
    }
    return 0;
}
$ ./program hello
こんにちは!
$ ./program goodbye
さようなら!
$ ./program unknown
不明なメッセージ: unknown

このプログラムは、引数に応じて異なる挨拶を表示します。

引数に基づくファイル操作

引数を使ってファイルを読み込んだり、書き込んだりすることができます。

ここでは、指定されたファイルを読み込んで内容を表示する例を示します。

#include <stdio.h>
int main(int argc, char *argv[]) {
    if (argc > 1) {
        FILE *file = fopen(argv[1], "r");
        if (file == NULL) {
            printf("ファイルを開けません: %s\n", argv[1]);
            return 1;
        }
        
        char line[256];
        while (fgets(line, sizeof(line), file)) {
            printf("%s", line);
        }
        fclose(file);
    } else {
        printf("ファイル名が指定されていません。\n");
    }
    return 0;
}
$ ./program example.txt
ファイルの内容が表示されます。

このプログラムは、指定されたファイルの内容を標準出力に表示します。

引数による設定変更

プログラムの設定をコマンドライン引数で変更することも可能です。

ここでは、引数でデバッグモードを切り替える例を示します。

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
    int debugMode = 0;
    if (argc > 1 && strcmp(argv[1], "debug") == 0) {
        debugMode = 1;
    }
    if (debugMode) {
        printf("デバッグモードが有効です。\n");
    } else {
        printf("通常モードで実行中です。\n");
    }
    // ここに通常のプログラム処理を記述
    return 0;
}
$ ./program debug
デバッグモードが有効です。
$ ./program
通常モードで実行中です。

このプログラムは、引数に”debug”が指定された場合にデバッグモードを有効にします。

応用例

コマンドライン引数を活用することで、より高度なプログラムを作成することができます。

ここでは、複数の引数を組み合わせた処理、引数のバリデーションとエラーハンドリング、簡易コマンドラインツールの作成について解説します。

複数の引数を組み合わせた処理

複数の引数を組み合わせて、より複雑な処理を行うことができます。

以下の例では、2つの数値を引数として受け取り、加算、減算、乗算、除算を行います。

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
    if (argc != 4) {
        printf("使用法: %s <num1> <operator> <num2>\n", argv[0]);
        return 1;
    }
    double num1 = atof(argv[1]);
    double num2 = atof(argv[3]);
    char operator = argv[2][0];
    double result;
    switch (operator) {
        case '+':
            result = num1 + num2;
            break;
        case '-':
            result = num1 - num2;
            break;
        case '*':
            result = num1 * num2;
            break;
        case '/':
            if (num2 == 0) {
                printf("エラー: 0で除算できません。\n");
                return 1;
            }
            result = num1 / num2;
            break;
        default:
            printf("不明な演算子: %c\n", operator);
            return 1;
    }
    printf("結果: %f\n", result);
    return 0;
}
$ ./program 10 + 5
結果: 15.000000
$ ./program 10 / 0
エラー: 0で除算できません。

このプログラムは、2つの数値と演算子を引数として受け取り、計算結果を表示します。

引数のバリデーションとエラーハンドリング

引数が正しい形式であるかを確認し、不正な場合には適切なエラーメッセージを表示することが重要です。

以下の例では、引数が整数であるかをチェックします。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int isNumber(const char *str) {
    while (*str) {
        if (!isdigit(*str)) {
            return 0;
        }
        str++;
    }
    return 1;
}
int main(int argc, char *argv[]) {
    if (argc != 2) {
        printf("使用法: %s <整数>\n", argv[0]);
        return 1;
    }
    if (!isNumber(argv[1])) {
        printf("エラー: 引数は整数でなければなりません。\n");
        return 1;
    }
    int number = atoi(argv[1]);
    printf("入力された整数: %d\n", number);
    return 0;
}
$ ./program 123
入力された整数: 123
$ ./program abc
エラー: 引数は整数でなければなりません。

このプログラムは、引数が整数であるかを確認し、不正な場合にはエラーメッセージを表示します。

簡易コマンドラインツールの作成

コマンドライン引数を利用して、簡易的なツールを作成することができます。

以下の例では、指定されたディレクトリ内のファイル数をカウントするツールを作成します。

#include <stdio.h>
#include <dirent.h>
int main(int argc, char *argv[]) {
    if (argc != 2) {
        printf("使用法: %s <ディレクトリパス>\n", argv[0]);
        return 1;
    }
    DIR *dir = opendir(argv[1]);
    if (dir == NULL) {
        printf("ディレクトリを開けません: %s\n", argv[1]);
        return 1;
    }
    int fileCount = 0;
    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL) {
        if (entry->d_type == DT_REG) {
            fileCount++;
        }
    }
    closedir(dir);
    printf("ファイル数: %d\n", fileCount);
    return 0;
}
$ ./program /path/to/directory
ファイル数: 10

このプログラムは、指定されたディレクトリ内のファイル数をカウントし、結果を表示します。

まとめ

この記事では、C言語におけるコマンドライン引数の処理方法について詳しく解説し、引数の数や内容の確認、条件に応じた処理の分岐、さらには応用例として複数の引数を組み合わせた処理やバリデーション、簡易ツールの作成方法を紹介しました。

これにより、コマンドライン引数を活用したプログラムの柔軟な設計が可能となります。

ぜひ、この記事を参考にして、実際のプログラム開発に役立ててください。

関連記事

Back to top button