パソコン活用研究シリコンバレー(C、C++、の活用研究)

コマンドライン引数の取得

--------------------------------------------------------------------------------------
コマンドラインから引数を取得して、C言語のプログラムの中で使いたいことがあります。そのやり方
についてまとめてみました。コマンドライン引数の取得にあたっては、通常はポインタ変数をを使いますので、
ポインタ変数について復習した方がいいかなと思う人は、再びポインタと配列などを参照して下さい。
--------------------------------------------------------------------------------------

1 コマンドライン引数の取得

コマンドライン引数取得の例題プログラムとして、おじさん自作のコピーコマンドプログラムcp.exeをとりあげて
説明いたします。動作の内容は、MS-DOS標準のcopyと同じです。
下の例はhello.txt をhello2.txtというファイル名でコピーしています。


C:\test>dir

2003/12/20 11:10 <DIR> .
2003/12/20 11:10 <DIR> ..
2003/12/20 11:10 13,451 CP.EXE
2003/12/20 11:07 19 hello.txt
2 個のファイル 13,470 バイト
2 個のディレクトリ 17,135,398,912 バイトの空き領域

C:\test>cp hello.txt hello2.txt

C:\test>dir

2003/12/20 11:10 13,451 CP.EXE
2003/12/20 11:07 19 hello.txt
2003/12/20 11:11 19 HELLO2.TXT
3 個のファイル 13,489 バイト
2 個のディレクトリ 17,135,398,912 バイトの空き領域

C:\test>

コマンドラインの引数はmain関数の仮引数として、受け取ります。
main関数の仮引数は、慣例的にargc,argvを使っていますが、何でもかまいません。

argc にはコマンドラインの引数の数が格納されます。MS-DOSではコマンド本体(実行ファイル。
上記の例では cp )も含んだ数が渡されます。従って、上記の例では argc=3です。
下は、cp.exeのソースの一部ですが、コマンドライン引数が3以下(引数が不足している場合 argc <3 )
の場合は、使用法の表示をさせています。

argv にはコマンドライン引数の実際の文字データが格納されます。**argv (ポインタのポインタ変数)
として宣言されていますので、わかりにくいかもしれませんが、上記の例を2次元配列に直して表す
と以下のようになります。

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]
argv[0] 'c' 'p' '\0'
argv[1] 'h' 'e' 'l' 'l' 'o' '.' 't' 'x' 't' '\0'
argv[2] 'h' 'e' 'l' 'l' 'o' '2' '.' 't' 'x' 't' '\0'
(表1)

main(argc, argv)
int argc;
char **argv;
{ int n;
FILE *fp, *fp2;

if(argc < 3) {
printf("Copy File Ver0.0.2\n");
printf("**** Usage ****\n");
printf("cp SorceFile DestinationFile\n");
printf("Option -r SourceFileを削除します\n");
exit(0);}

・・・・以下省略・・・・


2 コマンドラインの文字列を取り出して使う


cp.exeではコマンドラインから、コピー元のファイル名、コピー先のファイル名、オプションを引数として受け取り
使用します。
コピー元のファイル名はargv[1]、コピー先のファイル名はargv[2]、オプションはargv[3](これは省略される
こともある)に格納されます。

下はcp.exeのソースの抜粋です。
argv[1], argv[2] はファイルのオープンに使います。
argv[3]にはオプションが格納され "-r" が指定された時は、コピー元のファイルを削除します。(ファイルの
移動または、renameと同じことができます)

if(NULL == (fp=fopen(argv[1],"rb"))) {
printf("Cannot open File : %s\n",argv[1]);
exit(1);}

・・・・途中略・・・・

fp2=fopen(argv[2], "wb");

・・・・途中略・・・・

if ((argc == 4) && (strcmp(argv[3],"-r")==0 ) ){remove(argv[1]);}

・・・・以下略・・・・


上記の例で、コマンドラインの文字列を1文字づつ取り出したい時には、argvの2次元配列で表記をして
取り出せば簡単です。表1を参照して下さい。

以下に、一部だけですが、各文字を、2次元配列とポインタ変数で表した場合についてあげておきます。
[0][0] 'c'
argv[0][0]
*argv[0]
**argv
[0][1] 'p'
argv[0][1]
*(argv[0]+1)
*(*argv+1)
[0][2] '\0'
argv[0][2]
*(argv[0]+2)
*(*argv+2)
[1][0] 'h'
argv[1][0]
*argv[1]
**(argv+1)
[1][1] 'e'
argv[1][1]
*(argv[1]+1)
[1][2] 'l'
argv[1][2]
*(argv[1]+2)


TopPage