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 を同時に押すと強制終了できます。
これは困ったときの避難ボタンとして覚えておくと安心です。