argc と argv とは
これまで int main(void) と書いてきましたが、main関数は引数を受け取る形でも書けます。
int main(int argc, char *argv[]) {
// argc: 引数の個数(Argument Count)
// argv: 引数の文字列配列(Argument Vector)
}
例えば ./myprogram hello world と実行すると:
| 変数 | 値 | 意味 |
| argc | 3 | 引数は3つ |
| argv[0] | "./myprogram" | プログラム名 |
| argv[1] | "hello" | 第1引数 |
| argv[2] | "world" | 第2引数 |
重要: argv[0] はプログラム自身の名前です。ユーザーが渡した引数は argv[1] から始まります。
基本的な使い方
全引数を表示するプログラム:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("引数の個数: %d\n", argc);
for (int i = 0; i < argc; i++) {
printf("argv[%d] = %s\n", i, argv[i]);
}
return 0;
}
$ gcc args.c -o args
$ ./args hello world 123
引数の個数: 4
argv[0] = ./args
argv[1] = hello
argv[2] = world
argv[3] = 123
引数を数値として使う
argv の要素は全て文字列(char*)です。数値として使うには変換が必要です。
| 関数 | 変換先 | ヘッダ | 使用例 |
atoi(s) | int | stdlib.h | int n = atoi(argv[1]); |
atof(s) | double | stdlib.h | double d = atof(argv[1]); |
atol(s) | long | stdlib.h | long l = atol(argv[1]); |
例: コマンドライン電卓
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("使い方: %s 数値1 数値2\n", argv[0]);
return 1;
}
int a = atoi(argv[1]);
int b = atoi(argv[2]);
printf("%d + %d = %d\n", a, b, a + b);
return 0;
}
$ ./calc 15 27
15 + 27 = 42
引数チェックは必須です。argc を確認して、引数が足りない場合は使い方を表示して終了しましょう。
実践例: ファイル名を引数で渡す
実際のプログラムでは、処理対象のファイル名をコマンドライン引数で受け取ることが多いです。
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("使い方: %s ファイル名\n", argv[0]);
return 1;
}
FILE *fp = fopen(argv[1], "r");
if (fp == NULL) {
printf("ファイル '%s' を開けません\n", argv[1]);
return 1;
}
char line[256];
while (fgets(line, 256, fp) != NULL) {
printf("%s", line);
}
fclose(fp);
return 0;
}
$ ./cat scores.txt
Taro 80
Hanako 95
Jiro 70
これは UNIX の cat コマンドの簡易版です。
確認クイズ
// 以下のコマンドで実行したとき
// $ ./prog hello world
argc の値はいくつ?
2
3
1
0
解説: argc はプログラム名を含めた引数の個数。./prog, hello, world の 3つ。
argv[0]="./prog", argv[1]="hello", argv[2]="world"。
// $ ./calc 10 20 を実行
int a = atoi(argv[1]);
int b = atoi(argv[2]);
printf("%d\n", a + b);
出力は?
30
1020
エラー
0
解説: atoi("10") → 10、atoi("20") → 20。10 + 20 = 30。
atoi を使わないと文字列のまま連結("1020")になるので注意。
この講座の理解を深めるおすすめ書籍
サイトで動きを理解し、書籍で演習量を補うと効果的です
📙
プログラミング言語C 第2版
B.W.カーニハン, D.M.リッチー 著
通称K&R。C言語の原典。
Amazonで見る※ 上記リンクはアフィリエイトリンクです。購入によりサイト運営を支援いただけます。