C言語入門 第17回 コマンドラインからのパラメータ受け取り




2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を強力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。



1.コマンドラインでのパラメータ指定

 コマンドプロンプトでコマンドを入力するとき「dir file」や「dir /w」のようにパラメータ(fileや/wのこと)を指定することができます。 パラメータは複数個指定するこができます(例 dir /w ..)。 例えば、「dir /w ..」とコマンド入力するとカレントディレクトリより一つ上のディレクトリ内のファイル一覧を簡易表示(サイズなどを含む詳細表示ではなく)しるようにプログラムみ指示を与えます。

 このようなコマンドプロンプトで動作するプログラムを作成する場合、パラメータの指定は必要不可欠な要素になると思います。 またコマンドプロンプトからコマンド入力のことを、コマンドライン入力と表現します。 特にUNIXやLinuxでは、コマンドプロンプトという表現は使われず、コマンドラインと呼ばれています。


2.Study Cでのパラメータ指定

 Study Cではメニューやボタンなどから作成したプログラムを実行します。 ただしパラメータを与えてプログラムを実行する場合にはコマンドラインから実行する必要があります。 Study Cのコマンドモードから"run file"や"run /w .."のようにパラメータを指定してプログラムを実行します。 また、トレースモードなどの各実行モードは下記のようにコマンドラインから入力します。

        実行モード              書式                    例
        ------------------------------------------------------------
        通常実行                run パラメータ          run abc def
        ステップ実行            step パラメータ         run /def ghi
        トレース実行            trace パラメータ        trace file
        遅延トレース実行        slow パラメータ         slow a b c

 Study Cでは実行ボタンからプログラムを起動することもできます。 この場合Study Cは、プログラムの内容の確認してパラメータを受け取ろうとしているか確認を行います。 その結果、パラメータを受け取ろうとしているプログラムであれば入力ダイアログボックスを表示します(そうでない場合は、すぐに実行が開始されます。)。 入力ダイアログボックスでパラメータを入力し実行することができます。

パラメータ入力ダイアログボックス

 このダイアログボックスでパラメータを入力する場合、「run」や「trace」などの部分は入力する必要がありません。 上の例の「run abc def」なら「abc def」、「run /def ghi」なら「/def ghi」などと入力してください。


3.プログラムのパラメータ受け取り

Study Cに限らずC言語で作成したプログラムのパラメータの受け取り方法は共通しています。

 コマンドラインで入力したパラメータ文字列は、main関数の引数として渡されてきます。 パラメータ文字列をプログラムを受け取りたい場合はmain関数を次のように定義します。

main(int argc, char *argv[])
{
        .
        .
        .
}

「char *argv[]」はポインタの配列という意味ですが解りにくければ、パターンとして覚えてしまいましょう。 argcには入力したコマンドライン文字列の文字の塊りの数(空白で区切られた文字列の)を返します。 また、argv[0]、argv[1]、...にはそれぞれコマンドライン文字列の文字の塊りのポインタがセットされています。 たとえば"run abc def /ghi"と入力した場合argc、argvは次のようにセットされます。

argv[0]に「run」という文字列自体も引数にセットされることに注意してください(trace、slowでもrunとセットされます)。 通常のC言語コンパイラの場合は、argv[0]に最初の例の「dir」などの先頭部分の文字列がセットされます。

コマンドライン入力 : run abc def /ghi
        argc    : 4
        argv[0] : run
        argv[1] : abc
        argv[2] : def
        argv[3] : /ghi

 次のプログラムはargcとargvの内容を表示するものです。いろいろなパターン(run 1 2 3、run abc def...など)で実行してみてください。

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]);
        }
}
C:\StudyC\MyProg>run 1 2 3
argc = 4
argv[0] : run
argv[1] : 1
argv[2] : 2
argv[3] : 3

C:\StudyC\MyProg>run abc def /ghi
argc = 4
argv[0] : run
argv[1] : abc
argv[2] : def
argv[3] : /ghi


4.パラメータでのオプション指定

 「dir /w ..」の「/w」のような表記は、オプション的な要素を指定するときに使用します。 Windowsでは「/」で始まる文字(列)をオプションとするプログラムが主流です。また、UNIX/Linuxでは「-」がこれに相当します(例 ls -l ..)。

 オプション指定かどうかの判別はプログラムで行う必要があります。

main(int argc, char *argv[])
{
        int        i;

        printf("argc = %d\n", argc);
        for(i = 0; i < argc; i++){
                if(argv[i][0] == '/' || argv[i][0] == '-')
                {
                        printf("argv[%d] = %s - オプション\n", i, argv[i]);
                }
                else
                {
                        printf("argv[%d] = %s\n", i, argv[i]);
                }
        }
}
C:\StudyC\MyProg>run abc def /ghi
argc = 4
argv[0] : run
argv[1] : abc
argv[2] : def
argv[3] : /ghi - オプション

[an error occurred while processing this directive]