9. プログラムの部品化のための関数(3/3)
9.4 実行時引数の受け取り方
UNIX系OSではコマンドを使った操作が良く行われています。例えば、lsコマンドは次のような使い方になります。
ls -l /usr
この例の場合、「ls」はコマンド名、「-l」や「/usr」は引数とかパラメータと呼ばれています。当講座では関数の引数と区別するために「実行時引数」と呼ぶことにします。実行時引数はコマンドに渡すデータです。
C言語はUNIXを記述するために作られた言語ですので、C言語で記述したプログラムは当然のことながら、実行時引数を受け取ることが出来ます。実行時引数はmain関数に2つの引数として渡ってきます。第1引数はコマンド名を含めた実行時引数の個数で、第2引数は実行時引数の値そのものでポインタの配列です。ちなみに、第1引数は「argc」、第2引数は「argv」という名前にすることが習慣になっています。
9.4.1 形式
※ main関数の定義
int main(int argc, char *argv[])
{
…
return 値;
}
- int argc
- コマンド名(実行可能プログラムファイルのパス名)を含む実行時引数の個数です。
- char *argv[]
- 実行時引数の値そのものです。個々の実行時引数は文字列として取り扱うことができます。
9.4.2 例題
実行時引数に体重と身長を指定すると、肥満度(BMI)を出力するプログラムです。肥満度の計算はソースファイルex09_3_2.cに定義済のCalcBmi関数を使用します。
/* ソースファイル名:ex09_7.c */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
double weight;
double height;
double bmi;
int return_code;
/* CalcBmi関数のプロトタイプ宣言 */
double CalcBmi(double BmiWeight, double BmiHeight);
if(argc == 3)
{
weight = atof(argv[1]); /* 第1引数(体重)をdouble型に変換 */
height = atof(argv[2]); /* 第2引数(身長)をdouble型に変換 */
/* 肥満度(BMI)を返り値として取得 */
if((bmi = CalcBmi(weight, height)) > 0.0)
{
printf("肥満度は%.2fです\n", bmi);
return_code = 0;
}
else
{
printf("体重又は、身長の値が不当です\n");
return_code = 1;
}
}
else
{
printf("実行時引数の数が不当です\n");
return_code = 1;
}
return return_code;
}
$ gcc -o ex09_7.prg ex09_7.c ex09_3_2.c ← CalcBmi関数を定義しているex09_3_2.cも指定します
$
$ ./ex09_7.prg 69.6 174.5 ← 実行時引数として体重と身長を指定します
肥満度は22.86です
$
$ ./ex09_7.prg 69.6
実行時引数の数が不当です
$
- 4行目
- 実行時引数を受け取るために仮引数のargcとargvを指定します。
- 15行目
- 実行時引数の第1引数の体重をライブラリ関数のatof関数を使用してdouble型に変換します。実行時引数は文字列として渡ってきますので、そのままでは数値として使用することは出来ません。atof間数を使う場合は3行目の
#include <stdlib.h>
が必要です。
- 16行目
- 実行時引数の第2引数の身長をdouble型に変換します。
- 19行目
- CalcBmi関数を呼び出して、肥満度(BMI)を取得します。