さて、今回はscanf関数の解説です。printf関数と同じく
最後がfで終わる関数です。名前から推察されるように、
書式付き入力関数です。これが
また、大変なくせ者です。
どういう風にくせ者かは、だんだんわかってくると思います。
以前、筆者がある本を読んでいたら、プロのプログラマは、
この関数をほとんど使わないとのこと。
int a;とすると、int型の大きさでメモリのどこかに変数aが確保されます。 入力関数の場合、入力されたデータを変数の中に実際に入れてやらなくては いけません。そのためには、aが実際にいる(?)住所を教えてやら なくてはいけません。変数aの住所(アドレス)を&aで表します。 さて、&aを値として持つ変数pを考えると
p = &a;と言うものが考えられます。このときpをポインタと言います。 また、pのデータ型を宣言するときは、
int *p;とすればいいのです。どうです、あっさりした説明でしょう。 (え、よくわからない?ポインタについては、あとで詳しい解説 を書くので今は、雰囲気だけでOKです)
では、実際にscanfを使ったプログラムを書いてみましょう。
ex01.cを次のように書き換えてください。
#include <stdio.h>
#include <conio.h>
int main()
{
int a, b;
printf("a,bを入力してください。\n");
scanf("%d %d",&a, &b);
printf("a = %d b = %d\n", a, b);
printf("a + b = %d\n", a + b);
printf("何かキーを押してください\n");
getch();
printf("End");
return 0;
}
これを、ビルドして実行すると
左のような結果になります。少し説明すると
まず、「a,bを入力してください。」と表示されます。
そのあと、キーボードで12を入力し、リターン・キーを
押しました。その次に18と入力して、リターンキーを押すと
「a = 12 b = 18」「a + b = 30」「何かキーを押してください」
と、表示されます。その後適当なキーを押せば「End」と表示されて
プログラムが終了します。
さて、12や18と入力の度にリターン・キーを押さずに
一度に「12 18」と入力したらどうでしょうか?
(12と18の間に半角スペースを入れる)
答えは、最初のやり方と同じ結果になります。
また、自分でプログラムを作ったのでaやbは、int型だとわかりますが
全くの赤の他人がこのプログラムを実行して、とんでもない大きな
整数を入力したり、文字列を入力したらどうなるでしょうか。
実験してみてください。いろいろやってみるとこのプログラムの
まずい点がわかってくると思います。
#include <stdio.h>
#include <conio.h>
int main()
{
int a, b;
int *p, *q;
p = &a;
q = &b;
printf("a,bを入力してください。\n");
scanf("%d %d",p, q);
printf("a = %d b = %d\n", *p, *q);
printf("a + b = %d\n", *p + *q);
printf("何かキーを押してください\n");
getch();
printf("End");
return 0;
}
これでも、全く同じプログラムができます。&aや&bを使わずに
ポインタp,qを使っていることに注目してください。
また、a,bのかわりに、*p,*qを使っていることにも注意して
ください。
Update Oct/14/1996 By Y.Kumei