
C言語のきほん|変数に値を入力する
入力した値がそのまま変数に入る感動を体験しよう。scanfでint・double・charの入力をスッキリ整理!
printf で画面に表示できるようになると、次にやりたくなるのが「ユーザーに入力してもらう」ことです。
入力ができるようになると、プログラムは一気に“対話型”になって、できることが広がります。
この節では、C言語で特によく使う3つの型、
- int(整数)
- double(実数)
- char(1文字)
に対して、キーボードから入力して変数に入れる方法を身につけます。
scanf は少しクセがある関数ですが、ポイントさえ押さえれば大丈夫です。
特に、scanf では変数の前に & を付けること、double の入力では %lf を使うこと、char の入力では " %c" が便利なこと、この3つは確実に押さえていきましょう。
変数に入力する流れをざっくりつかもう
入力プログラムは、基本的にこの流れで作るとわかりやすいです。
1. printfで入力を促す
2. scanfで入力してもらう(ここで入力待ち)
3. printfで入力結果を表示して確認する
入力がうまくいっているかは、まず表示して確認するのが一番安心です。
scanfの基本形をもう一度確認
scanf は次の形で使います。
scanf(変換指定, 変数のアドレス);ここで重要なのは、2つ目が「変数の値」ではなく「変数のアドレス」だという点です。
printfとscanfで必要なものが違う
同じ %d でも、printf と scanf では役割が違います。
- scanf は変数に値を書き込むため、変数のアドレスが必要
- printf は変数の値を表示するため、変数の値が必要
表すとこんな感じです。
scanf("%d", &n); → 変数のアドレスが必要
printf("%d", n); → 変数の値が必要
この違いがわかると、& を付ける理由がスッと理解しやすくなります。
int型に10進整数を入力する
C言語で最もよく使われる型のひとつが int です。
scanf で int に入力するときは %d を使います。
例のイメージ
- 入力が 123
- 変数 n に 123 が入る
- printf で表示して確認
使う書式はこの組み合わせです。
- scanf:%d
- printf:%d
double型に実数を入力する
実数(小数)を扱うときによく使うのが double です。
scanf で double に入力するときは %lf を使います。
ここはかなり大事なポイントです。
- scanfでdouble → %lf
- scanfでfloat → %f
一方、printf で表示するときは、double も float も %f を使うのが一般的です。
- printfでdouble → %f
char型に1文字を入力する
1文字を入力したいときは char 型を使います。
scanf では %c を使います。
ただし、ここが scanf のクセが出るところで、%c は空白や改行も1文字として読み取ります。
そのため、前の入力で Enter を押したときの改行が残っていると、それを拾ってしまうことがあります。
そこで、よく使うテクニックが " %c" です。
%c の前に半角スペースを入れると、空白や改行を読み飛ばしてから次の1文字を読み取ってくれます。
- scanfでchar → " %c"
- printfでchar → %c
サンプルプログラムでまとめて確認しよう
ファイル名:5_8_1.c
#include <stdio.h>
int main(void)
{
int age;
double height;
char grade;
/* 整数を入力してもらう */
printf("年齢を入力してください > ");
scanf("%d", &age);
/* 実数を入力してもらう */
printf("身長を入力してください(例: 170.5)> ");
scanf("%lf", &height);
/* 1文字を入力してもらう(空白や改行を読み飛ばすためにスペース付き) */
printf("評価を1文字で入力してください(例: A)> ");
scanf(" %c", &grade);
/* 入力結果を表示して確認する */
printf("\n入力された内容\n");
printf("年齢 : %d\n", age);
printf("身長 : %f\n", height);
printf("評価 : %c\n", grade);
return 0;
}実行結果例(入力はユーザーが打ったもの)
年齢を入力してください > 20
身長を入力してください(例: 170.5)> 172.3
評価を1文字で入力してください(例: A)> B
入力された内容
年齢 : 20
身長 : 172.300000
評価 : B身長の表示が小数点以下6桁になっているのは、%f の精度を省略しているためです。
見やすくしたいなら %.1f や %.2f にする方法もあります(前の節でやった精度指定ですね)。
サンプルプログラムの解説
intの入力は%dで読む
scanf("%d", &age);%d は10進整数として読み取る指定です。
入力された数字が、そのまま int 変数に入ります。
printf で表示するときも %d を使います。
printf("年齢 : %d\n", age);doubleの入力は%lfで読む
scanf("%lf", &height);ここが超重要ポイントです。
double に入力するときは %lf を使います。%f ではありません。
表示は %f でOKです。
printf("身長 : %f\n", height);charの入力は" %c"が安心
scanf(" %c", &grade);%c の前の半角スペースがポイントです。
これがあることで、改行や空白を読み飛ばして、次の入力文字をしっかり取れます。
もしスペースなしで書くと、直前の入力の改行を拾ってしまい、思った通りに動かないことがあります。
scanfの書式文字列はシンプルにする
scanf の書式文字列には、基本的に変換指定だけを書くのが安全です。
良い例:
scanf("%d", &age);避けたい例:
scanf("age = %d", &age);後者のように余計な文字を入れると、入力側にもその文字列が含まれていることを期待してしまい、うまく読み取れなくなります。
複数の値を読む場合も、変換指定を並べて書くのが基本です。
scanf("%d%d", &a, &b);入力不一致に注意する
scanf は、変換指定に合わない入力があると読み取りに失敗します。
たとえば %d なのに英字を入力すると、読み取れなかった文字が入力バッファに残ります。
この状態で次の scanf をすると、残った文字が邪魔をして動作が崩れることがあります。
繰り返し入力するプログラムでは、これが原因で無限ループになることもあります。
入門の段階ではまず、
- scanf は入力が合わないと失敗することがある
- 失敗した入力が残ることがある
ということだけ覚えておけばOKです。対処はもう少し後で扱うと理解しやすいです。
プログラムが止まったら入力待ち、終わらないならCtrl+C
scanf を使うと、入力待ちの間プログラムが止まったように見えますが正常です。
入力して Enter を押せば進みます。
もし無限ループなどで止まらなくなった場合は、コマンドプロンプトなら Ctrl と C を同時に押すと強制終了できます。
これは困ったときの避難ボタンとして覚えておくと安心です。
