ログイン
kid's world

値を受け取る関数

値を受け取る関数

getmonth関数は,1から12までの整数の入力を受け付けて,その値を返す関数であった。しかし,もう少し汎用性を持たせて,任意の範囲の整数値を返す関数に改良してみたい。関数名は「getint」としよう。

任意の範囲ということは,関数を呼び出すときに最小値と最大値を指定しなければならないということである。すなわち,関数の引数として最小値と最大値を指定できればよいということになる。

引数を受け取る関数はどのように書けばよいのだろうか。引数を受け取らない関数はカッコの中には何も書かないで定義したが,引数の必要な関数はそのカッコの中に引数の宣言を書く。getint関数は,2つの引数を必要とする。したがって,2つの引数を宣言することになる。具体的には,List 5のようになる。

List 5: getint関数

#include <stdio.h>

int getint(int min, int max);

int getint(int min, int max)
{
  int i;
  
  do {
    printf("%dから%dの範囲の整数を入力してください。\n",min,max);
    if (scanf("%d", &i)!=1)
      scanf("%*s");
  } while (i<min || max<i);
  
  return i;
}

main()
{
  printf("%dが入力されました。\n", getint(10,20));
}

関数の定義のカッコの中を注目していただきたい。

int min, int max

となっている。これが,引数の宣言である。これは,int型の引数を2つとり,それぞれをmin,maxという変数で扱うという意味になる。main関数では,

getint(10,20)

という部分があるが,このようにgetint関数を呼び出すと,min変数には10,max変数には20が入った状態で関数の内部が実行される。

このように,関数の引数の宣言はまるで変数の宣言のように書くことができる。関数が呼び出されるときに引数として渡された値が,それぞれの変数に入るというイメージだ。

配列や文字列を受け取る

以上,単純な値を引数として受け取る方法について見てきたが,配列や文字列などはどのように扱えばよいのだろうか。勘のいい方はもう気づいたかもしれない。そう,配列も文字列もポインタとして扱えばよいのだ。

List 5で作成したgetint関数ではメッセージが表示されるが,場合によってはそのメッセージを変えたり,表示を抑制したりしたい場合があるだろう。したがって,この文字列も引数で指定できるようにしておくと便利である。

文字列は,char型へのポインタとして扱う。したがって,List 6のように書けばよいことになる。

List 6: メッセージ引数付きのgetint関数

#include <stdio.h>

int getint(int min, int max, char *msg);

int getint(int min, int max, char *msg)
{
  int i;
  
  do {
    printf(msg);
    if (scanf("%d", &i)!=1)
      scanf("%*s");
  } while (i<min || max<i);
  
  return i;
}

main()
{
  int i;
  
  i=getint(10,20,"10から20の整数:");
  printf("%dが入力されました。\n", i);
}

配列も同じだ。ポインタとして受け取って,あとから配列のように使うことができることは,すでに学んだとおりである。したがって,

void foo(int *a)

と引数を宣言して,その関数内部で,

a[0]=10;

などと書くことができる。ポインタではなく,とくに配列として宣言する必要があるならば,

void foo(int a[])

という書き方もある。


ポインタを利用した値の返し方」へ進む

広告


©Toshio Koide 1996-2007.

目次

リンクについて

リンクは御自由にどうぞ。

メール

mail.gif

広告