Thinkers'Studio
JavaとC言語の自習ツール
argc, argv は何の略?(コマンドライン引数の使用例)

 プログラム起動時に指定する値(コマンドライン引数)は、関数 main の仮引数として受け取ることができます。
 コマンドライン引数を受け取るときは、下記のような形式で main を書きます。

【main 関数の形式】
  int main( int argc, char *argv[] )
 仮引数なので別の名前にしても構いませんが、ふつうは argc, argv を使います。
 argc は argument count(引数の個数)、argv は argument vector(引数の配列)の略です。 つまり引数文字列の "配列へのポインタ" ですね。

コマンドライン引数の使用例】
 「うるう年判定プログラム」のコマンドライン引数版です。

#include <stdio.h>
#include <stdlib.h>
#define MAXCNT 50

int main( int argc, char *argv[] )
{
    int from, to, year, cnt;

    if( argc < 2 || argc > 3 ) {
        printf( "Usage$ %s year [n]\n", argv[0] );
        return 1;
    }
    from = atoi( argv[1] );
    cnt = ( argc == 3 ) ? atoi( argv[2] ) : 1;

    if( cnt < 1 ) cnt = 1;
    else if( cnt > MAXCNT ) cnt = MAXCNT;
    to = from + cnt;

    for( year = from; year < to; year++ ) {
        if( year % 4 == 0 && year % 100 != 0 || year % 400 == 0 )
            printf( "%d年はうるう年です\n", year );
        else
            printf( "%d年は平年です\n", year );
    }
    return 0;
}
 このプログラムをコンパイルして、たとえば isLeapYear.exe を作り、コマンドラインで実行するなら
$ isLeapYear 2012      ・・・ と打ち込んで実行すると
2012年はうるう年です   ・・・ と実行結果が表示されます
 この実行例では、コマンドライン引数の個数 argc は 2 です。
 先頭の引数 argv[0] は isLeapYear、2番目の引数 argv[1] は 2012 です。
 argv[0] はいつでも起動されたプログラム名です。使い方を示す printf文では、argv[0] を表示しています。
 argv[2] に年数を指定した場合は、argv[1] の年からその年数分のうるう年判定ができるようにしました。
 年数は 1 〜 50 の範囲にリミット調整しています。   (参考: 改良前のうるう年判定プログラム

 (今回のクイズです)
 上のプログラムをコマンドラインで次のように指定して実行すると、どんな結果になるでしょう。
 (1), (2), (3) のそれぞれについてどんな結果が表示されるか考えてください。

$ isLeapYear                ・・・ (1)
ここに表示される(1)の実行結果は?
$ isLeapYear 2099 3         ・・・ (2)
ここに表示される(2)の実行結果は?
$ isLeapYear 2013 2014      ・・・ (3)
ここに表示される(3)の実行結果は?
   (答えは、次回のC言語の Tips で ・・・)
前回のクイズの答え: コンパイルでエラーになり、実行できない。 (前回の問題を見る
 LIST の typedef宣言が完結する前に、LIST を使っているためです。