【C言語】コマンドライン引数(argc, argv)の使い方をわかりやすく解説

コマンドライン引数とは、プログラムを実行する際にコマンドラインから渡される引数のことです。

この記事では、C言語でコマンドライン引数を扱う方法について解説します。

目次

コマンドライン引数とは何か?

プログラムを実行する際に、コマンドラインから引数を渡すことができます。この引数のことを「コマンドライン引数」と呼びます。

例えば、以下のようなC言語プログラムがあった場合、

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("argc = %d\n", argc);
    for (int i = 0; i < argc; i++) {
        printf("argv[%d] = %s\n", i, argv[i]);
    }
    return 0;
}

このプログラムを以下のように実行すると、

$ ./a.exe arg1 arg2 arg3

次のような出力が得られます。

argc = 4
argv[0] = ./a.out
argv[1] = arg1
argv[2] = arg2
argv[3] = arg3

このように、argcは引数の個数を表し、argvは文字列型配列で各引数の値を保持します。

argc・argvの使い方

C言語において、main関数の引数としてargcとargvがあります。

  • argcは、コマンドライン引数の個数を表します。
  • argvは、コマンドライン引数の文字列を指すポインタ配列です。

例えば、以下のようなプログラムを考えます。

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("argc = %d\n", argc);
    for (int i = 0; i < argc; i++) {
        printf("argv[%d] = %s\n", i, argv[i]);
    }
    return 0;
}

このプログラムでは、まずargc(コマンドライン引数の個数)をprintfで出力し、その後forループでargv(コマンドライン引数)を順番に出力しています。

このプログラムを実行する際に、コマンドライン引数として”hello”と”world”を渡す場合、以下のようになります。

$ ./a.exe hello world
argc = 3
argv[0] = ./a.out
argv[1] = hello
argv[2] = world

つまり、argcは3であることから、コマンドライン引数が3つあることがわかります。また、argv[0]には実行ファイル名が格納されており、それ以降に渡された引数が順番に格納されています。

以上がC言語におけるargcの使い方です。

コマンドライン引数を用いたサンプルプログラム

コマンドライン引数を利用することで、プログラムの実行時に外部から値を受け取ることができます。

この機能を使うことで、プログラムの柔軟性が向上し、ユーザーが入力する値に応じて動作を変えることができます。

コマンドライン引数を利用したプログラム例1:ファイル名を指定して読み込むプログラム

以下は、コマンドライン引数を利用してファイル名を指定してファイルの内容を読み込むプログラムです。

#include <stdio.h>

int main(int argc, char *argv[]) {
    FILE *fp;
    char ch;

    if (argc != 2) {
        printf("Usage: %s filename\n", argv[0]);
        return 1;
    }

    fp = fopen(argv[1], "r");
    if (fp == NULL) {
        printf("Error opening file.\n");
        return 1;
    }

    while ((ch = fgetc(fp)) != EOF) {
        putchar(ch);
    }

    fclose(fp);

    return 0;
}

このプログラムでは、argcが2であるかどうかチェックし、2でない場合は使用方法を表示して終了します。

argv[0]には実行ファイルの名前が格納されており、argv[1]には第一引数(つまりファイル名)が格納されています。これらの値はmain()関数の引数から取得することができます。

次に、指定されたファイルを開きます。

もし開くことが出来なかった場合はエラーメッセージを表示して終了します。正常に開けた場合は、ファイルから文字列を読み込んで表示しています。

コマンドライン引数を利用したプログラム例2:コマンドラインから数字を入力して計算するプログラム

以下は、コマンドライン引数から数字を受け取って加算するプログラムです。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int sum = 0;

    for (int i = 1; i < argc; i++) {
        sum += atoi(argv[i]);
    }

    printf("Sum: %d\n", sum);

    return 0;
}

このプログラムでは、atoi()関数を使って文字列型の数字データ(char*) を整数型(int)に変換し加算します。また、for文内では最初の要素(つまり実行ファイル名)はスキップしています。

以上がC言語におけるコマンドライン引数の使い方です。

コマンドライン引数の注意点・エラー処理について

コマンドライン引数を扱う際には、いくつかの注意点があります。また、エラー処理も必要です。

コマンドライン引数の注意点

引数の数が足りない場合

プログラムを実行する際に、必要な引数が指定されていない場合があります。この場合、プログラムは正しく動作しません。そのため、引数の数をチェックして、足りない場合はエラーメッセージを表示するようにしましょう。

引数の型が異なる場合

コマンドライン引数は文字列として渡されます。そのため、数字や真偽値などのデータ型を扱う場合には、適切に変換する必要があります。

エラー処理

プログラム実行中にエラーが発生した場合には、適切なエラーメッセージを表示してプログラムを終了させるようにしましょう。具体的には、以下のようなエラー処理が考えられます。

引数の数が足りない場合

if (argc < 2) {
    printf("Usage: %s [filename]\n", argv[0]);
    return 1;
}

引数の型が異なる場合

char *endptr;
long num = strtol(argv[1], &endptr, 10);
if (*endptr != '\0') {
    printf("Invalid argument: %s\n", argv[1]);
    return 1;
}

上記例では、strtol()関数を使って文字列から整数へ変換しています。strtol()関数は第2引数で変換後の文字列位置を返すため、それを利用して変換後に余計な文字列が残っているかどうかチェックしています。

目次