第11回|scanfで入力を受け取る:キーボードから値を読む基本

当サイトでは、コンテンツの一部に広告を掲載しています。
第11回|scanfで入力を受け取る:キーボードから値を読む基本

はじめてのC言語 | 第11回

目次

はじめに

前回は、文字と文字列の基本を学びました。
今回は、キーボードから入力を受け取る方法を扱います。

この回の目的は次の4点です。

  • scanf の基本形を理解する
  • 整数を入力として受け取れるようにする
  • 変数のアドレスを渡す理由を知る
  • 初学者がつまずきやすい点を先に押さえる

scanf とは何か

scanf は、標準入力から値を読み取るための関数です。
ここでいう標準入力とは、通常はキーボードからの入力です。

たとえば、ユーザーが入力した整数を変数に保存したいときに使います。

最初のサンプルコード

ソースコード

input_number.c という名前で保存します。

#include <stdio.h>

int main(void) {
    int age;

    printf("age: ");
    scanf("%d", &age);

    printf("You entered: %d\n", age);

    return 0;
}

実行手順

1. 作業ディレクトリに移動する

cd ~/Desktop

2. コンパイルする

clang input_number.c -o input_number

3. 実行する

./input_number

4. 値を入力する

実行すると、次のように表示されます。

age:

ここで 20 と入力して Enter キーを押します。

実行例:

age: 20
You entered: 20

コードの読み方

int age;

入力された整数を保存するための変数 age を宣言しています。

printf(“age: “);

入力を促すメッセージを表示しています。

scanf(“%d”, &age);

ここが入力を受け取る部分です。

  • %d : 整数を読み取る
  • &age : 読み取った値を age に格納する場所を渡す

printf(“You entered: %d\n”, age);

入力された値を確認のために表示しています。

なぜ &age と書くのか

scanf は、読み取った値を変数の中に書き込みます。
そのため、変数そのものではなく、「その変数が置かれている場所」を渡す必要があります。

C言語では、その場所を表すために & を使います。

scanf("%d", &age);

この段階では、&age は「age に値を書き込むための指定」と理解すれば十分です。

整数を2つ入力する例

scanf では、複数の値をまとめて読み取ることもできます。

#include <stdio.h>

int main(void) {
    int x;
    int y;

    printf("x y: ");
    scanf("%d %d", &x, &y);

    printf("x = %d\n", x);
    printf("y = %d\n", y);

    return 0;
}

実行例:

x y: 10 20
x = 10
y = 20

入力するときは、空白で区切って 10 20 のように書けます。

入力した値で計算する例

#include <stdio.h>

int main(void) {
    int a;
    int b;

    printf("a b: ");
    scanf("%d %d", &a, &b);

    printf("sum = %d\n", a + b);

    return 0;
}

実行例:

a b: 3 5
sum = 8

入力を使うと、毎回違う値でプログラムを試せます。

文字列入力は最初は分けて考える

scanf は文字列入力にも使えますが、初学者向けにはまず整数入力から確実に理解する方が安全です。
文字列入力は、配列サイズや空白の扱いで混乱しやすいためです。

この回では、int 型の入力に絞って理解すれば十分です。

初心者がつまずきやすい点

age ではなく &age

整数を scanf で読むときは、変数名だけではなく & を付けます。

正しい例:

scanf("%d", &age);

誤った例:

scanf("%d", age);

後者は誤りです。

%d は整数用

%d は int 型の入力に使います。
型が違うのに %d を使うと、正しく読み取れません。

入力待ちの状態で止まって見える

scanf を使ったプログラムは、入力されるまで先に進みません。
止まっているように見えても、入力待ちであることがあります。

scanf の戻り値も重要

技術的には、scanf は読み取りに成功した個数を返します。
初学者向けでも、この点は早めに知っておくと安全です。

たとえば、整数を1つ読むなら、成功時は 1 が返ります。

より安全な書き方

#include <stdio.h>

int main(void) {
    int age;

    printf("age: ");

    if (scanf("%d", &age) != 1) {
        printf("Input error\n");
        return 1;
    }

    printf("You entered: %d\n", age);

    return 0;
}

このコードでは、整数として正しく読めなかった場合にエラーとして終了します。

なぜ戻り値を確認するのか

たとえば数字ではなく文字を入力すると、期待どおりに読み取れないことがあります。
scanf の戻り値を確認すると、その失敗を検出できます。

初学者向けの最初の段階では、まず基本形を覚え、その後に戻り値確認を加える流れで問題ありません。
ただし、実務や安全なコードでは確認する方が適切です。

よくあるエラー

warning: format specifies type ‘int *’ but the argument has type ‘int’

原因: & を付け忘れています。

誤った例:

scanf("%d", age);

正しい例:

scanf("%d", &age);

数字以外を入れて期待した結果にならない

原因: %d は整数を期待しているためです。
文字列や記号を入力すると、読み取りに失敗します。

入力が複数あるのに書式が合っていない

たとえば、2つ入力したいのに %d が1つしかないと正しく読めません。

正しい例:

scanf("%d %d", &x, &y);

練習用コード

整数を1つ入力して表示する

#include <stdio.h>

int main(void) {
    int number;

    printf("number: ");
    scanf("%d", &number);

    printf("%d\n", number);

    return 0;
}

整数を2つ入力して合計を表示する

#include <stdio.h>

int main(void) {
    int x;
    int y;

    printf("x y: ");
    scanf("%d %d", &x, &y);

    printf("%d\n", x + y);

    return 0;
}

まとめ

今回のポイントは次のとおりです。

  • scanf を使うとキーボードから値を読み取れる
  • int を読むときは %d を使う
  • scanf には変数の場所を渡すので &変数名 と書く
  • 入力待ちで止まって見えるのは正常な動作である
  • より安全にするなら scanf の戻り値を確認する

この回では、scanf を使って整数入力を受け取る方法を確認しました。
表示だけだったプログラムに入力が加わると、動きのあるプログラムを書けるようになります。

次回予告

次は、ポインタの基本を学びます。
今回登場した &amp;ageのような書き方の正体も、ここでしっかり理解できるようになります。

最初は少し難しく感じるかもしれませんが、心配はいりません。ひとつずつ、ゆっくり進めていきましょう。

さらに学びたいあなたへ

用途ごとに選ぶ Linux のおすすめ本

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

のいのアバター のい UNIX Cafe マスター

Macintosh Color Classicから始まった旅は、長いWindows時代を経て、Windows10のサポート終了をきっかけにUNIXの世界へ戻ってきました。UNIX Cafeでは、UNIX・Linux・そしてMacな世界を、むずかしい言葉を使わず、物語のように書いています。プログラミングは、アイデアをコンピューターに伝えるための言葉です。簡単な単語と文法を覚えれば、誰でもコマンドを使えます。ぜひ一度、やさしいプログラミングの世界をのぞいてみてください。

Created by UNIX Cafe

目次