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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- argc と argv
- オプションの解析
- getopt
- CLI ツールの作成