C言語を学習していると、プログラムの入口であるmain関数に「int main()」だけでなく「int main(int argc, char **argv)」という形式が登場します。これはコマンドラインから実行時に引数を受け取るための仕組みであり、実用的なプログラムでは頻繁に利用されます。この記事ではargcとargvの意味や使い方、具体的な利用例について分かりやすく解説します。
int main(int argc, char **argv)とは
main関数はプログラムの実行開始地点です。その中でも「int main(int argc, char **argv)」は、プログラム実行時に渡された情報を受け取れる形式です。
各引数の意味は次の通りです。
| 引数 | 意味 |
|---|---|
| argc | コマンドライン引数の個数 |
| argv | コマンドライン引数の文字列配列 |
argcはArgument Count、argvはArgument Vectorの略です。
どのようなときに使うのか
この形式は、実行時にユーザーからパラメータを受け取りたい場合に利用します。
例えばファイル処理ツールで、読み込むファイル名を実行時に指定したいケースがあります。
program.exe sample.txt
この場合、「sample.txt」がコマンドライン引数としてプログラムへ渡されます。
ファイル変換ソフトやバックアップツール、コンパイラなどのコマンドラインアプリでは非常によく利用される仕組みです。
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;
}
例えば以下のように実行した場合です。
sample.exe hello world
出力結果は次のようになります。
argc = 3
argv[0] = sample.exe
argv[1] = hello
argv[2] = world
argv[0]には通常プログラム自身の名前が格納されます。
char **argvが分かりにくい理由
初心者がつまずきやすいのが「char **argv」です。
これは「文字列へのポインタの配列」を表しています。実際には複数の文字列を格納したリストのようなものと考えると理解しやすいでしょう。
次のように考えることができます。
- argv[0] → プログラム名
- argv[1] → 1番目の引数
- argv[2] → 2番目の引数
- argv[3] → 3番目の引数
実務では文字列配列として扱うことがほとんどです。
GUIアプリではあまり使われない
WindowsのGUIアプリやゲームなどでは、ユーザーがコマンドラインから起動する機会が少ないため、argcやargvを使う場面は比較的少なくなります。
一方でLinux環境やサーバー管理ツール、開発支援ツールなどでは現在でも頻繁に利用されています。
特にシステムプログラミングや組み込み開発を学ぶ場合は理解しておくべき重要な知識です。
int main()との違い
引数を必要としないプログラムであれば、単純なmain関数でも問題ありません。
| 形式 | 用途 |
|---|---|
| int main(void) | 引数を受け取らない |
| int main(int argc, char **argv) | 引数を受け取る |
簡単な学習用プログラムではmain(void)が使われることが多いですが、実用的なツールではargcとargvを利用するケースが増えます。
まとめ
「int main(int argc, char **argv)」は、プログラム実行時にコマンドライン引数を受け取るためのmain関数の形式です。argcは引数の個数、argvは引数の内容を格納した文字列配列を表します。ファイル操作ツールやコマンドラインアプリなどで広く利用されており、C言語を本格的に学ぶ際には必ず理解しておきたい基本知識の一つです。


コメント