🇯🇵 日本語 | 🇺🇸 English

第7回 確認問題(scanf)

C言語のscanfの理解度を確認するインタラクティブなクイズ。

🎬
この講座を動画で見る(約7分)
注目ポイント解説 + 音声ナレーション

確認問題1 ― scanf の基本

int a;
double b;
printf("aの値を入力:");
scanf("%d", &a);
printf("bの値を入力:");
scanf("%lf", &b);
printf("a は %d, b は%f \n", a, b);
aに5、bに3を入力した場合の出力は?

出力結果は?

a は 5, b は3.000000
a は 5, b は3
a は 5.000000, b は3.000000
解説: aはint型で%dで表示→5。bはdouble型で%fで表示→3.000000(%fはデフォルトで小数点以下6桁)。正しい書式指定子を使っているので正常に表示されます。

確認問題2 ― & を忘れたらどうなる?

scanf("%d", a);   // ← &がない!
scanf("%lf", b);  // ← &がない!

何が起こる?

正常に動作する
エラーが発生し、入力直後にプログラムが止まる
0が表示される
解説: scanfでは変数のアドレス(&をつけたもの)を渡す必要があります。&がないと、変数の「値」をアドレスとして解釈するため、不正なメモリアクセスが発生してプログラムが異常終了します。
scanfには必ず&をつけましょう!

確認問題3 ― scanf で型を間違えたら?

int型aの入力に%lf、double型bの入力に%dを使っています。
int a;
double b;
scanf("%lf", &a);  // intなのに%lf!
scanf("%d", &b);   // doubleなのに%d!
aに3、bに5を入力した場合、printf("a=%d, b=%f", a, b) の結果は?

出力結果は?

a は 3, b は 5.000000
a は 0, b は 0.000000(正しく表示されない)
コンパイルエラー
解説: scanfの書式と変数の型が一致しないと、メモリへの書き込みサイズが合わず、正しい値が格納されません。環境によって表示は異なりますが、期待した値にはなりません。
scanf:整数は%d、実数は%lfを正しく設定しましょう。

確認問題4 ― 一度に2つの値を入力する

1つの scanf で複数の変数を受け取るパターン。書式の間に空白がある点に注目。
int a, b;
printf("2つの整数を入力: ");
scanf("%d %d", &a, &b);
printf("a=%d, b=%d\n", a, b);
ユーザーが 3 7(間にスペース)と入力してEnterを押したときの出力は?

出力結果は?

a=3, b=7
a=3, b=0(bに値が入らない)
a=37, b=未初期化(連結される)
コンパイルエラー(scanfは1つまで)
解説: 1つの scanf で複数の変数を同時に受け取れます。書式 "%d %d" は、空白・タブ・改行で区切られた2つの整数を順に読む指定。
・1つ目の %d ← 最初の整数 3 → a
・2つ目の %d ← 次の整数 7 → b
なお、書式の中の空白は「任意個の空白文字を読み飛ばす」意味なので、3 7 でも 3   7(たくさん空白)でも、改行を挟んでも動きます。

確認問題5 ― double なのに %f を使ったら?

printf では %f で OK だった double。scanf ではどうでしょう?
double x;
printf("小数を入力: ");
scanf("%f", &x);   // %lf ではなく %f!
printf("x = %f\n", x);
3.14 と入力してEnterを押したときの出力は?

出力結果は?

x = 3.140000(問題なく動く)
x = 0.000000 もしくは意味不明な数値
コンパイルエラー
解説: ここが scanf 特有の罠。printf は %f でも double を扱えますが、scanf では double には必ず %lf が必要です。
%f を使うと、scanf は「float 型(4バイト)に書き込むつもり」でアドレスに値を書くため、8バイトの double 変数を部分的にしか埋めない→ 値が壊れて意味不明な数値になります。
覚え方: printf なら %f でOK、scanf なら %lf 必須

確認問題6 ― 書式文字列に余計な文字を入れると?

プロンプトのつもりで書式の中に文字を入れると意外な挙動に。
int a;
scanf("a=%d", &a);   // 書式に「a=」を含めた
printf("a = %d\n", a);
ユーザーが単に 5 と入力した場合、何が起こる?

何が起こる?

a = 5 が表示される
プログラムは入力を受け取らず、aに値が入らない
「a=」と表示されてから入力待ちになる
コンパイルエラー
解説: scanf の書式文字列に %d 以外の文字を入れると、入力もその文字列で始まる必要があるという意味になります。
"a=%d" は「入力が a= で始まって、そのあと整数がくる」という指定。だから入力が a=5 ならOKですが、ただの 5 では先頭の a= と一致せず、scanfは読み取りに失敗して a に値が入りません
プロンプトを出したいときは、別の printf で出すのが鉄則。書式文字列にはなるべく %d%lf などの書式指定子だけを書きましょう。

確認問題7 ― int と double を連続で受け取る

scanf を2回呼んで、別々の型を順に受け取るパターン。
int age;
double height;
printf("年齢: ");
scanf("%d", &age);
printf("身長(cm): ");
scanf("%lf", &height);
printf("%d歳 %.1fcm\n", age, height);
ユーザーが 25(Enter)170.5(Enter)と入力したときの出力は?

出力結果は?

25歳 170.5cm
25歳 170.500000cm
エラー(2回目の入力で止まる)
25歳 0.0cm(2つ目が読めない)
解説: scanf は書式指定子ごとに正しい型(int なら %d + &int変数、double なら %lf + &double変数)を使えば、何度でも連続して呼べます。改行を挟んでも正しく処理されます。
最後の printf で %.1f を使っているので、170.500000 ではなく 170.5(小数1桁で四捨五入)と表示されます。
25歳 170.5cm

関連する講座

入門編
第4回 printf・scanf
C言語のprintf関数とscanf関数の使い方。書式指定子を一覧で解説。
入門編
第6回 確認問題(変数・printf)
C言語の変数とprintfの理解度を確認するクイズ。
入門編
第3回 変数
C言語の変数とは?int, double, charの使い方を図解で解説。
← 前の講座
第6回 確認問題(変数・printf)
次の講座 →
第8回 算術演算子
この記事をシェア
X(Twitter)でシェア Facebookでシェア LINEで送る はてブ

この講座の理解を深めるおすすめ書籍

サイトで動きを理解し、書籍で演習量を補うと効果的です

📘
苦しんで覚えるC言語
MMGames 著
初心者向けの定番入門書。丁寧な解説で基礎を固められます。
Amazonで見る
📗
新・明解C言語 入門編
柴田望洋 著
図解が豊富で、演習問題も充実。大学の教科書としても採用多数。
Amazonで見る
📙
プログラミング言語C 第2版
B.W.カーニハン, D.M.リッチー 著
通称K&R。C言語の原典。基礎を終えた後のステップアップに最適。
Amazonで見る

※ 上記リンクはアフィリエイトリンクです。購入によりサイト運営を支援いただけます。