いままでmain関数は引数なしとしてプログラムを作ってきましたが、引数を受け取ることができます。main関数はOSによって呼び出されるので引数を指定するのもOSの役割です。引数を受け取る時のプロトタイプは
int main(int argc,char *argv[]);
となります。argvはcharの配列の配列、つまり複数の文字列です(*argvの意味は第8章で説明します)。argcは文字列の個数です。
#include <stdio.h>
int main(int argc,char*argv[]){
int i;
printf("引数:%d個\n",argc);
for(i=0;i<argc;i++) printf("%d番目の引数:%s\n",i,argv[i]);
return 0;
}
実行結果
引数:1個
0番目の引数:C:\Users\gukos\Desktop\test\main.exe
普通にプログラムを実行すると、実行ファイルのパスが引数として呼び出されます。明示的にmain関数に引数を与えるには、コマンドラインで半角スペースで区切って文字列を指定します。
コマンドライン
main 引数A 13 引数B
実行結果
引数:4個
0番目の引数:C:\Users\gukos\Desktop\test\main.exe
1番目の引数:引数A
2番目の引数:13
3番目の引数:引数B
main関数が受け取れる引数はcharの配列型なので、整数をコマンドラインで指定しても文字列として認識されます。また、エクスプローラーやデスクトップの画面において実行ファイルに別のファイルをドラッグするとそのファイルのパスがコマンドライン引数となります。例えば、筆者の場合エクスプローラーでmain.exeにmain.cをドラッグすると
引数:2個
0番目の引数:C:\Users\gukos\Desktop\test\main.exe
1番目の引数:C:\Users\gukos\Desktop\test\main.c
と表示されます。ただし、黒い画面が一瞬で消えるので確認しにくいです。
main関数が引数を受け取るとき、第1引数にint型を、第2引数にchar*[]型を受け取るのが一般的です。あまり知られていませんが、実は第3引数も存在します。
int main(int argc,char*argv[],char*envp[]);
この第3引数は環境変数を表します。環境変数とはプログラム同士が共有するデータのことです。例えばWindowsの環境変数にはCPUの情報やOSが使用するフォルダのパスなどが含まれています。
#include <stdio.h>
int main(int argc,char*argv[],char*envp[]){
int i;
printf("引数:%d個\n",argc);
for(i=0;i<argc;i++) printf("%d番目の引数:%s\n",i,argv[i]);
for(i=0;envp[i];i++) printf("%d番目の環境変数:%s\n",i,envp[i]);
scanf("%d",&i);
return 0;
}
実行結果
引数:1個
0番目の引数:C:\Users\gukos\Desktop\test\main.exe
0番目の環境変数:=::=::\
1番目の環境変数:...
(以下省略)
ただし、すべての処理系で使えるとは限らないので第3引数はあまり使用しません。
まとめ
main関数は引数を受け取ることができる。
多くの場合はint型とchar配列の配列型の2つの引数を受け取る。
コメント