ここまでのプログラムは、いつ動かしても同じ結果でした。人からの入力を受け取れるようになると、プログラムは急に「道具」になります。標準入力から値を読む代表が scanf です。
いちばん短い例
#include <stdio.h>
int main(void) {
int nen;
printf("好きな数を入れてください: ");
scanf("%d", &nen);
printf("入力されたのは %d です\n", nen);
return 0;
}int nen; で入れ物(変数)を用意し、scanf("%d", &nen); でそこに数値を読み込みます。書式指定子は printf と同じ考え方で、%d は整数、%lf は double、%c は1文字です。
なぜ & が要るのか
printf は値を「見せる」だけなので、値そのものを渡せば済みます。scanf は変数の中身を「書き換える」ので、値ではなく置き場所を教える必要があります。&nen は「nen という箱の番地」という意味です。
2つまとめて読む
#include <stdio.h>
int main(void) {
int tate, yoko;
printf("縦と横を空白区切りで: ");
scanf("%d %d", &tate, &yoko);
printf("面積は %d です\n", tate * yoko);
return 0;
}%d %d と並べれば、空白や改行で区切られた2つの数を続けて読めます。scanf は空白・タブ・改行を「区切り」として読み飛ばします。
戻り値を確かめる
scanf は「いくつ読み込めたか」を返します。これを見れば、入力が想定どおりだったか判定できます。
#include <stdio.h>
int main(void) {
int n;
printf("整数を1つ: ");
if (scanf("%d", &n) == 1) {
printf("%d を受け取りました\n", n);
} else {
printf("整数として読めませんでした\n");
}
return 0;
}if は次のトラックの内容ですが、「1つ読めたら成功」という形だけ覚えておくと、この先ずっと役に立ちます。
罠・注意
& を忘れる。 コンパイルが通ってしまうことがあり、実行するといきなり異常終了します。scanf を書いたら & を指差し確認します。
double は %lf。 printf では %f ですが、scanf では %lf です。ここだけ非対称なので間違えやすいところです。
入力を促すメッセージを先に出す。 printf で「何を入れてほしいか」を書かないと、画面が固まったように見えます。
まとめ
scanf は書式に従って標準入力から値を読み、読み込めた個数を返します。書き換える相手の場所を教えるため & が必要で、double を読むときだけ %lf になります。そして——scanf には初心者を必ず一度つまずかせる罠があります。次のトピックで正面から片づけます。