プログラムの引数

これまでは、プログラムに対して数値や文字を入力する時には、下図のように、プログラムを実行してから数値や文字を入力していました。

プログラムに数字や文字を入力する方法には、これ以外に、「プログラムを実行する時にプログラムに対して数値や文字などを同時に指定する」という方法もあります。初級編で勉強したように、C言語では関数に対して値(引数)を渡すことが出来ますが、プログラムに対しても引数を渡すことが出来ます。このような「プログラムに対する引数」は正確には、「main関数に対する引数」として扱われます。以下はその使用例ですが、scanf関数やgets関数と違ってプログラム実行時に底辺と高さの値を入力しているのが分るでしょうか。ここでは、このようなmain関数に対する引数の使い方について説明します。

main関数に渡すことができる引数には、以下の二つがあります。

第1引数・・・メイン関数の引数の個数。データ型はint型
第2引数・・・メイン関数の引数の中身。データ型はchar型のポインタの配列。
※第1引数、第2引数ともに名前は任意ですが、第1引数の名前にはargc、第2引数の名前にはargvを用いるのが慣例です。

つまり、引数をとり得るプログラムのmain関数は以下のような形になるわけです。

使用例
#include <stdio.h>

main(int argc, char *argv[]){
 ............
 適切なプログラム
 ............
}

ここで、上記のプログラムをtestという名前でコンパイルして、図のように実行したとします。つまりプログラムに"abc", "123", "XYZ"の3つの引数を渡して実行したとします。このときの引数argc, argvの内容は以下のとおりになります。ここで注意すべきは、引数の数え方と第0引数の存在です。argcには引数の数+1の数値が与えられます。これは、プログラム名そのものが第0引数としてプログラムに与えられるためです。従って、argv[0]のポインタが指す内容は"./test"となります。

引数名 説明 内容
argc 引数の数 4
argv[0] 第0引数(プログラム名そのもの)の内容 "./test"
argv[1] 第1引数の内容 "abc"
argv[2] 第2引数の内容 "123"
argv[3] 第3引数の内容 "XYZ"

このような、main関数に対する引数を利用すると、以下のような与えられた数字の合計を求めるプログラムがscanf関数などを利用することなく作成することが可能です。

使用例
     1  #include <stdio.h>
     2  #include <stdlib.h>  ← なぜこれが必要なのかは自分で考えてみてください。
     3  
     4  main(int argc, char *argv[]){
     5      int a,b,sum;
     6      if(argc != 3){
     7          printf("引数の数が違います。\n");
     8          printf("使い方:%s 数値1 数値2\n", argv[0]);
     9          exit(1);
    10      }
    11      sum=atoi(argv[1])+atoi(argv[2]);
    12      printf("合計=%d\n", sum);
    13  }

このプログラムでは、6行目で引数argcを用いて正しい数の引数(2つ)が入力されているかどうかをチェックしています。このように、引数argcは入力された引数の数のチェックなどに多用されます。

もし、正しい数の引数が入力されていなければ、エラーメッセージと使用方法を画面に表示してプログラムを終了します(7〜9行目)。

このプログラムで最も注意すべき点は、「プログラムの引数として入力されたデータはすべて文字列である」という点です。つまり、この例では3と5という数字がキーボードから入力されていますが、これらは文字列として渡されているため、このままでは四則演算などの計算が全く行えないということです。そのため、文字列を整数に変換するatoi関数を用いています。

int atoi(string)
      
ここで、stringは数値に変換したい文字列で、いわゆる半角の数字からなる文字列でなければなりません。また、この関数の返り値は変換後の数値です。つまり、atoi("1234")は、文字列「1234」を整数1234へ変換することになります。従って、atoi("1234")+atoi("2")は1236という整数値になります。

ちなみに、atoiは文字列(ascii)をint型へ変換する関数であり、同様に文字列をdoublet型へ変換する関数としてatof関数というものがあります。詳しくは、 コマンドラインで「man 3 atof」と入力して、関数のマニュアルを参照してください。


演習問題3-1

下記のように入力されたすべての数値(小数も含む)の和を求めるプログラムsouwaを作成せよ。但し、入力される数値の数は不定である。

演習問題3-1の解答


レポート課題3-1

下記のように、数値1、演算子(+, -, x, /のいずれか)、数値2で指定された演算を行うプログラムcomputeを作成せよ。