0Pricing
C Academy · レッスン

argc と argv

プログラム引数を読み取ります。

「argc と argv」はCoddyKit上の無料C Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。

プログラムは引数を受け取る

ターミナルからプログラムを実行するとき、コマンドライン引数と呼ばれる追加の単語を渡せます。

Cでは、mainの2つのパラメーターを通じてこれらを受け取ります。argc(引数の数)とargv(引数の配列)です。

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("This program received %d arguments\n", argc);
    return 0;
}

mainのシグネチャ

mainの完全な形式は次のとおりです。

  • int main(int argc, char *argv[])

argcは引数の数です。argvは、引数ごとに1つの文字列ポインターを持つ配列です。

#include <stdio.h>

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

argv[0]はプログラム名

最初の要素である argv[0] は、プログラムの呼び出しに使用された名前(またはパス)です。

そのため、ユーザーが追加の引数を渡さなかった場合でも、argc は少なくとも 1 になります。

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("Program name: %s\n", argv[0]);
    return 0;
}

すべての引数を出力する

インデックス 0 から argc - 1 までループすると、argv 内のすべての引数文字列を順に処理できます。

#include <stdio.h>

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

argv は NULL 終端される

C 標準では、argv[argc] が必ず NULL ポインターになることが保証されています。

つまり、argc を使わずに NULL に到達するまでループできますが、argc で数えるほうが一般的です。

#include <stdio.h>

int main(int argc, char *argv[]) {
    char **p = argv;
    while (*p != NULL) {
        printf("%s\n", *p);
        p++;
    }
    return 0;
}

引数は常に文字列

数値であっても、すべての引数は文字列として渡されます。ユーザーが 42 を渡した場合、受け取るのは整数ではなく、テキスト "42" です。

atoi や strtol などの関数を使って、自分で変換する必要があります。

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

int main(int argc, char *argv[]) {
    if (argc > 1) {
        int n = atoi(argv[1]);
        printf("Number plus one is %d\n", n + 1);
    } else {
        printf("Pass a number\n");
    }
    return 0;
}

引数の個数を確認する

argv[i] を読み取る前に、必ず argc を確認してください。渡された引数の範囲を超えるインデックスにアクセスすると、未定義動作になります。

通常は、十分な数の引数が渡されたことを確認し、そうでなければ使用方法を示すメッセージを出力します。

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("Usage: %s <name>\n", argv[0]);
        return 1;
    }
    printf("Hello, %s!\n", argv[1]);
    return 0;
}

ゼロ以外の終了コードを使用する

引数が正しくない場合は、main からゼロ以外の値を返して、シェルに失敗を通知します。

慣例では、0 は成功、それ以外の値はエラーが発生したことを表します。

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc != 3) {
        printf("Need exactly 2 arguments\n");
        return 1;
    }
    printf("Got both arguments\n");
    return 0;
}

数値引数を合計する

実用的な例として、コマンドラインで渡されたすべての数値を atoi で変換し、それを合計してみましょう。

#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;
}

argv の別の表記方法

char *argv[] の代わりに char **argv と書かれていることがあります。関数パラメーターとしては、どちらも最初の文字列ポインターを指すポインターを意味します。

どちらの形式でも argv[i] でインデックスアクセスできます。

#include <stdio.h>

int main(int argc, char **argv) {
    if (argc > 1)
        printf("First arg: %s\n", argv[1]);
    return 0;
}

引数をそのまま出力する

おなじみの echo コマンドは、引数をそのまま出力します。ここでは、引数をスペースで区切って結合する最小限のバージョンを示します。

#include <stdio.h>

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

理解度チェック

argc と argv についての理解度を確認しましょう。

まとめ

プログラムがコマンドライン入力を読み取る方法を学びました。

  • main(int argc, char *argv[]) は個数と配列を受け取ります。
  • argv[0] はプログラム名で、実際の引数はインデックス 1 から始まります。
  • argv[argc] は NULL です。
  • 引数は常に文字列なので、atoi で数値に変換し、最初に argc を検証します。

よくある質問

「argc と argv」レッスンは無料ですか?

はい。「argc と argv」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。

「argc と argv」で何を学びますか?

プログラム引数を読み取ります。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「argc と argv」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC Academyレッスンでコードを書いて実行できますか?

はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. argc と argv
  2. オプションの解析
  3. getopt
  4. CLI ツールの作成
← C Academyに戻る