とらりもんHOME  Index  Search  Changes  Login

とらりもん - 引数の与え方 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

<[[C言語入門]]に戻る>

 プログラムに何かの値を渡すには、標準入力だけでなく、コマンドラインから行うこともできる。例として、以下のプログラムを考える:

    /* add2.c
     * usage (example): $ ./add2 1.2 3.6
     * compile: $ gcc add2.c -o add2
     * 2008/07/16 K. Nasahara
     */
    # include <stdio.h>
    # include <stdlib.h>
    int main(int argc, char **argv)
    {double x, y;
     x=atof(argv[1]);
     y=atof(argv[2]);
     printf("%f + %f = %f\n", x, y, x+y);
    }

コンパイルと実行:
$ gcc add2.c -o add2
$ ./add2 1.2 3.6
1.200000 + 3.600000 = 4.800000

このように、これは2つの実数の和を求めるプログラムである。同様のプログラムは[[最初にも作った|C言語入門1. 体験]]が, それとはちょっと違う。最初に作ったプログラムでは2つの実数は標準入力から与えたが, ここでは2つの実数は{{fontc(コマンドラインから与えている, red)}}のだ。このように, コマンドラインから与える情報のことを「引数」という(Linuxのテキストを参照せよ)。

 情報は標準入力から与えてもよいのだが、目的によっては、標準入力には別のデータを与えるために、あえてこのようにコマンドラインから引数として与えるほうが好都合なことも多い。このようなスタイルは、シェルスクリプトとの相性が良く、シミュレーションなどで多用される。

 さて、この仕組みをざっくりと見ておこう。

 まず、これまでのほとんどのプログラムでmain()だった部分が今回は
main(int argc, char **argv)
になっている。argcとargvという名前の変数はこのように引数をプログラムに渡したいときには決まって登場する。argcはint型の変数であり, ここには引数の個数が自動的に格納される。argvは、文字列の「ポインタのポインタ」である。詳細な仕組みは割愛するが、argv[0]という文字列(配列)に、ゼロ番めの引数としてコマンド自体の名前が入り、argv[1]には1番めの引数(この場合は1.2)が入り, argv[2]には2番めの引数(この場合は3.6)が入る。引数が3個以上ある場合は, 以下同様である。

'''質問''': argc, argvはどういう意味の名前なのですか?

'''回答''': argはargument(引数を意味する英語)の略です。cとvはちょっと自信ないのですが, 多分cはcount(個数), vはvariable(変数)を意味するのではないでしょうか。

 さて、"1.2"という引数はプログラムに与えられた時点では文字列型の変数(配列)として表現されている。これを、実数として認識し直すために、
x=atof(argv[1]);
という命令を実行している。このatofという関数は、文字列として表現された実数を、実数型(double型)の値として認識し直すものである(ちなみに、文字列を整数として認識し直す関数はatoiである)。

また、この関数を使うためにプログラムの冒頭部分でstdlibというライブラリを使うことを宣言している。それは
# include <stdlib.h>
という部分である。

'''課題7-1''': atofとatoiのマニュアルをmanコマンドで表示して流し読みしてみよ。これらを使うにはstdlib.hが必要であるという情報はどこに書かれているか?

'''課題7-2''': 上のプログラムで, # include <stdlib.h>の行を削除してコンパイルを試みてみよ。どのようなエラーが出るか?(このように作為的にエラーを経験しておくと, いずれ同様のエラーに出会った時に解決策がひらめきやすくなる。)

'''課題7-3''':
コマンドラインから正の整数nの値を得て、1からnまでの和を計算するプログラムを作れ。

<[[C言語入門]]に戻る>