第6章 scanf関数


さて、今回はscanf関数の解説です。printf関数と同じく 最後がfで終わる関数です。名前から推察されるように、 書式付き入力関数です。これが また、大変なくせ者です。 どういう風にくせ者かは、だんだんわかってくると思います。 以前、筆者がある本を読んでいたら、プロのプログラマは、 この関数をほとんど使わないとのこと。

「えっ?scanf?そういえばそんな関数もあったなー」

それ以来、筆者はscanf関数は使わず、もっぱら入力関数は サードパーティで提供しているライブラリを利用していました。 が、基本が大事なので超初心者は、scanfも勉強しなくてはいけない。

int scanf(control, arg1, arg2, ...,argn)

controlのところは、printfと同じですが、argの部分は、 ポインタであることに注意してください。

えっ!ポインターて何だ?

入門書では、ポインタについてくどくどと書いてありますから、 くどい性格の人は入門書を読んでください。あっさり説明すると
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を使っていることにも注意して ください。

ポインタの雰囲気おわかりいただけたでしょうか?


[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Oct/14/1996 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。