C言語の scanf 関数でキーボードからの入力を変数に取り込む方法。& の意味、%lf の罠、よくあるバグを1つずつ理解しましょう。
scanf("%d", &x); で入力を受け取る& を絶対に忘れない%lf(printfの%fと違う!)fgets のほうが安全&」と「%lf」の2点で初学者を痛めつけます。どちらも後のポインタの話まで続く概念なので、今は「ルール」として覚えてOK。& は変数の「住所」を渡す合図 ― 後のポインタで詳しく%lf(scanfのみ、printfは %fでOK)& 忘れ&忘れ」か「%lf忘れ」。疑いは先にこの2点。
printfが「画面に出す」なら、scanfは「キーボードから受け取る」。反対方向の関数です。printf("%d\n", a); // 変数 a の値を画面に出す
scanf("%d", &a); // キーボードから受け取った値を変数 a に格納
int a; printf("aの値を入力: "); // プロンプト表示 scanf("%d", &a); // キーボード入力を受け取る printf("aは %d です\n", a);
& (アンパサンド) が必要か& をつけること。これを忘れるとプログラムがクラッシュします。& を忘れるとどうなるかint a; scanf("%d", a); // ❌ & を忘れた
a には値が入っています。&a は「その変数が置かれているメモリ上のアドレス」を表します。&a)を渡す。
&。printf には付けない(printfは値を読むだけだから)。詳しい仕組みは第29回 ポインタで。char name[50]; scanf("%s", name); // ← 配列名には & を付けない
& なしでOK。今は「配列だけ例外」と覚えておけば十分です。%lf。これは printf と違うルールで、よくハマります。| 型 | scanf の書式 | printf の書式 |
|---|---|---|
int | %d | %d |
float | %f | %f |
double | %lf ⚠️ | %f(%lfでもOK) |
char | %c | %c |
| 文字列 | %s | %s |
double b; scanf("%f", &b); // ❌ double には %lf が必要
-Wall をつければ警告してくれる。
%lf( lは「long」の l )。scanfのときだけ気をつけろ。scanf("%d", &a);scanf("%lf", &b);scanf("%d\n", &a); ← \n不要scanf("値を入力%d", &a); ← 文章NG%c と他の書式を混ぜたときに注意。int a; double b; printf("整数を入力: "); scanf("%d", &a); printf("小数を入力: "); scanf("%lf", &b); // ← lf ! printf("a=%d, b=%f\n", a, b);
int a; if (scanf("%d", &a) != 1) { printf("整数を入れてください\n"); return 1; }
& を外してクラッシュを観察(教訓になる)%f で読んで値が壊れるのを確認scanf("%d %d", &a, &b); で2つの整数をスペース区切りで同時入力char を %c で受け取るchar s[50] を %s で受け取る(空白まで)