あなたはコマンドライン(キーボードだけで操作する画面ーーコマンドプロンプトやターミナルなどーー)を使って、
次のようなコマンド入力をしたことはありませんか?

	% cp ファイル1 ファイル2
	% copy ファイル2 ファイル2

このcpコマンドやcopyコマンドを実行しますと、ファイル1をファイル2にコピーします。
C言語を使いますと、このようなコマンドラインのプログラムを簡単に作ることができます。
ポイントになるのは、プログラムに、ファイル名を入力する処理です。
これまでC言語超入門では、キーボードから対話形式でデータを入力する方法や、
ファイルからデータを入力する方法についてお伝えしてきました。
・ 【C言語超入門(第28回)】入出力の方法を学ぼう
・ 【C言語超入門(第41回)】ファイルからの入出力の方法を学ぼう(文字列の入出力編)
今回のC言語超入門では、プログラムの実行ファイルにパラメータを付与してプログラムに読み込ませる方法をご紹介いたします。

ファイルをコピーするプログラムを作ってみよう

冒頭でご紹介しましたファイルをコピーするコマンドラインプログラム(cpやcopy)と同じプログラムを、
実際に作ってみましょう。
以下は、ファイルをコピーするサンプルプログラムです。

/* ファイルをコピーするサンプルプログラム */
#include <stdio.h>
int main(int argc, char *argv[]){
    FILE *fpi, *fpo;
    char moji[BUFSIZ];
    if((fpi=fopen(argv[1],"r"))==NULL) printf("%sファイルのオープンに失敗", argv[1]);
    else {
        if((fpo=fopen(argv[2],"w"))==NULL) printf("%sファイルのオープンに失敗", argv[2]);
        else {
            while(fgets(moji,BUFSIZ,fpi)!=NULL) fputs(moji,fpo);
            fclose(fpo);
        }
        fclose(fpi);
    }
}
※Unix環境におけるコマンドラインからの実行例(実行ファイル名はa.outです)
% ls
a.out data1.txt sample.c
% cat data1.txt
これはデータ1のファイルです
% ./a.out data1.txt data2.txt
% ls
a.out data1.txt data2.txt
% cat data2.txt
これはデータ1のファイルです

コマンドラインから引数を渡すには決まり文句がある

C言語においてコマンドラインから引数を渡す場合には、次の決まり文句があります。

	main(int argc, char *argv[])

変数argcには引数の数、配列argvには引数文字列が格納されます。
上記のサンプルプログラムの実行例であれば、変数argc、配列argvには、次のように情報が入ります。

		- argc ・・・ 3
		- argv[0] ・・・ ./a.out
		- argv[1] ・・・ data1.txt
		- argc[2] ・・・ data2.txt

気を付けたいポイントは、argv[0]には実行ファイル名が入ることです。
なお、変数名は任意の名前を付けることができますが、多くのプログラマーがargc、argvを使っているようです。
特別な事情が無い限り、コマンドラインから引数を渡す場合は、決まり文句として

	main(int argc, char *argv[])

と記述するほうがよいでしょう。
なお、変数argcや配列argvに格納されるデータは、次のプログラムを使うことで確認できますので、ご活用くださいませ。

/* 変数argcと配列argvの確認プログラム */
#include <stdio.h>
main(int argc, char *argv[])
{
        int i;
        printf("argc = %d\n", argc);
        for(i=0;i<argc;i++) {
                printf("argv[%d] =  %s\n", i, argv[i]);
        }
}
※Unix環境におけるコマンドラインからの実行例(実行ファイル名はa.outです)
% ./a.out
argc = 1
argv[0] =  ./a.out
% ./a.out abcd efgh ijkl
rargc = 4
argv[0] =  ./a.out
argv[1] =  abcd
argv[2] =  efgh
argv[3] =  ijkl

C言語超入門の第42回まとめ

さて今回のC言語超入門では、コマンドラインから引数を渡す方法についてご紹介しましたが、いかがでしたでしょうか。
最後にもう一度、コマンドラインから引数を渡す方法についてポイントを整理しておきます。
・ コマンドラインから引数を得るには main(int argc, char *argv[]) という決まり文句がある
・ argcには引数の数、argv[]には引数の文字列が入る
・ argv[0]には実行ファイル名が入る
ステップ・バイ・ステップ。焦らず一歩ずつ進んでいきましょう。