C言語のきほん|scanfでキー入力を受け取ろう

今度はプログラムに答えてもらおう。scanfで「入力するC言語」の第一歩をはじめよう。

ここまでのプログラムでは、表示する内容をあらかじめコードの中に書いていました。
でもC言語のプログラムは、それだけではありません。キーボードから入力した値を受け取って、その内容に合わせて表示を変えることもできます。

この「入力を受け取る」ために使うのが scanf です。
scanf を覚えると、プログラムが少しずつ「会話できるもの」になっていきます。ここから、C言語の面白さがぐっと広がります。

このパートでは、まず細かい理屈を追いすぎず、次のポイントをしっかりつかむことを目標にします。

  • scanf で整数を入力できる
  • 入力した値を printf の %d で表示できる
  • 変数に値を入れて使う流れが見えてくる
  • キーボード入力時の基本的な操作が分かる
  • よくあるミスを避けられる

最初は scanf の書き方に少し戸惑うかもしれません。特に & が出てくるので、急に難しく感じやすいです。
でも今は、入力した数値をプログラムの中で使うための決まりとして覚えれば大丈夫です。まずは動かして体験してみましょう。

scanfを使うと何ができるの?

これまでの printf では、たとえばこんなふうに、数値をプログラム側で決めて表示していました。

printf("今日は%dページ進めます。\n", 8);

この場合、8 はコードの中で固定です。
毎回違う数値にしたいときは、コードを書き換える必要がありました。

scanf を使うと、実行中にキーボードから数値を入力して、その値を使えるようになります。

イメージ(これまでとこれから)

これまで:プログラムが決めた内容を表示する
これから:入力された値を受け取って表示する

つまり、プログラムが少しだけ「会話っぽく」なります。

まずは全体の流れをつかもう

scanf を使うプログラムは、次の流れで動きます。

入力ありプログラムの基本の流れ

手順内容
1変数を用意する
2scanf でキーボード入力を受け取る
3printf で入力された値を表示する

図で見る流れ

キーボードで数値を入力
        ↓
scanfで受け取る
        ↓
変数に入る
        ↓
printfで表示する

この流れが見えてくると、scanf の役割が分かりやすくなります。

サンプルプログラム

「学習計画を入力して表示する」シンプルなプログラム例です。

ファイル名:3_7_1.c

// キー入力した値で学習計画を表示するプログラム
#include <stdio.h>

int main(void)
{
    int study_pages;      // 今日進めるページ数
    int practice_count;   // 解く演習問題の数
    int focus_minutes;    // 集中する時間(分)

    scanf("%d%d%d", &study_pages, &practice_count, &focus_minutes);

    printf("こんにちは。今日の学習計画を表示します。\n");
    printf("今日は%dページ進める予定です。\n", study_pages);
    printf("演習問題を%d問解く予定です。\n", practice_count);
    printf("まずは%d分集中して取り組みます。\n", focus_minutes);

    return 0;
}

実行結果例

このプログラムを実行すると、最初にカーソルが点滅して入力待ちになります。
そこで、3つの整数をスペース区切りで入力して Enter を押します。

入力例

10 4 30

実行結果例

こんにちは。今日の学習計画を表示します。
今日は10ページ進める予定です。
演習問題を4問解く予定です。
まずは30分集中して取り組みます。

入力した 10、4、30 が、そのまま表示に反映されていますね。
これが scanf の基本的な使い方です。

コードを1つずつやさしく確認しよう

ここからは、変更版サンプルを使って、scanf のポイントを順番に見ていきます。

変数を用意する

まず、入力した値を入れておくための「入れ物」を用意します。これが変数です。

int study_pages;      // 今日進めるページ数
int practice_count;   // 解く演習問題の数
int focus_minutes;    // 集中する時間(分)

ここで大事なこと

  • int は整数用の型
  • 変数名は自分で分かりやすく付けてよい
  • 今回は3つの整数を入力するので、変数も3つ用意している

変数の役割

変数名入る値
study_pagesページ数10
practice_count問題数4
focus_minutes分数30

scanfで入力を受け取る

次が今回の主役です。

scanf("%d%d%d", &study_pages, &practice_count, &focus_minutes);

少し長く見えますが、意味を分解すると分かりやすいです。

scanfの形(今回の例)

部分意味
scanfキーボード入力を受け取る関数
"%d%d%d"整数を3つ入力するという指定
&study_pages1つ目の入力を入れる場所
&practice_count2つ目の入力を入れる場所
&focus_minutes3つ目の入力を入れる場所

今はこう覚えればOK

  • %d は整数入力の指定
  • 入力する数の分だけ %d を並べる
  • 変数の前に & を付ける(整数入力のとき)

& の細かい意味は後の章でしっかり出てきます。
この段階では、scanf で整数を受け取るときの書き方の決まりとして覚えて大丈夫です。

printfで入力された値を表示する

scanf で受け取った値は、変数に入っています。
その変数を printf の %d に渡せば、入力内容を表示できます。

printf("今日は%dページ進める予定です。\n", study_pages);
printf("演習問題を%d問解く予定です。\n", practice_count);
printf("まずは%d分集中して取り組みます。\n", focus_minutes);

ここでやっていることは、前の %d の学習と同じです。
違うのは、数字を直接書く代わりに、変数名を書いているところです。

以前との違い

書き方意味
数字を直接書くprintf("%dページ\n", 8);8を固定表示
変数を使うprintf("%dページ\n", study_pages);入力された値を表示

このつながりが分かると、%d と scanf の関係がすごく理解しやすくなります。

実行するときの入力方法(大事)

scanf("%d%d%d", ...) の場合、整数を3つ入力します。
入力の区切りは、スペースでも Enter でも大丈夫です(最初はスペース区切りが分かりやすいです)。

入力方法の例(おすすめ)

10 4 30

これは次のように対応します。

  • 10 → study_pages
  • 4 → practice_count
  • 30 → focus_minutes

対応表

入力順変数
1つ目study_pages10
2つ目practice_count4
3つ目focus_minutes30

入力順と変数の並び順が対応しているのがポイントです。

よくあるつまずきポイント

scanf は便利ですが、最初はミスしやすいところがいくつかあります。
ここを先に知っておくと安心です。

変数の前の & を忘れる

例(ミス)

scanf("%d%d%d", study_pages, practice_count, focus_minutes);

これだと正しく動きません。
scanf で整数を受け取るときは、変数の前に & が必要です。

正しくはこう

scanf("%d%d%d", &study_pages, &practice_count, &focus_minutes);

これは最初のうちは特に忘れやすいので、毎回チェックしましょう。

%d の数と変数の数が合っていない

例(ミス)

scanf("%d%d", &study_pages, &practice_count, &focus_minutes);

%d が2つしかないのに、変数は3つあります。
このような不一致はトラブルの原因になります。

基本ルール

  • %d の数
  • 変数の数
  • 実際に入力する数

この3つをそろえるのが基本です。

数字以外を入力してしまう

scanf("%d") は整数を期待しています。
そのため、文字を入力すると、うまく読み取れないことがあります。

例(注意)

ten 4 30

1つ目が数字ではないので、期待通りに動きません。

最初の練習では、まず 半角の整数を入力する ことを意識してください。

入力待ちで止まったように見える

scanf は必要な入力がそろうまで待ちます。
そのため、実行直後に何も表示されないと「止まった?」と感じることがあります。

でも実際は、入力待ち です。カーソルが点滅していれば正常です。

迷ったときの確認

  • カーソルが点滅しているか
  • 数字を3つ入力して Enter を押したか
  • %d の個数と入力数が合っているか

入力前に案内メッセージを出すと親切

今回のサンプルでも動作は問題ありませんが、実際には scanf の前に案内を表示しておくと分かりやすくなります。
初心者向けのプログラムでは特におすすめです。

例(案内を追加)

printf("ページ数、問題数、集中時間(分)を入力してください。\n");
scanf("%d%d%d", &study_pages, &practice_count, &focus_minutes);

こうしておくと、何を入力すればいいかがすぐ分かります。

改良版のサンプル(案内付き)

学習しやすいように、案内メッセージを追加した版も載せておきます。

ファイル名:3_7_2.c

// キー入力した値で学習計画を表示するプログラム(案内付き)
#include <stdio.h>

int main(void)
{
    int study_pages;      // 今日進めるページ数
    int practice_count;   // 解く演習問題の数
    int focus_minutes;    // 集中する時間(分)

    printf("ページ数、問題数、集中時間(分)をこの順に入力してください。\n");
    scanf("%d%d%d", &study_pages, &practice_count, &focus_minutes);

    printf("こんにちは。今日の学習計画を表示します。\n");
    printf("今日は%dページ進める予定です。\n", study_pages);
    printf("演習問題を%d問解く予定です。\n", practice_count);
    printf("まずは%d分集中して取り組みます。\n", focus_minutes);

    return 0;
}

最初はこういう「入力の説明付き」のプログラムの方が、動かしていて安心感があります。

Visual C++でscanfが使えないと言われる理由(やさしく理解)

Visual C++(Visual Studio のC/C++環境)では、scanf に対して警告やエラーが出ることがあります。
これは「scanf が危険だから使えない」というより、安全性を重視した独自ルールがあるためです。

ざっくり整理すると

環境scanf の扱い
GCC標準の scanf を普通に使う
Visual C++scanf に警告が出ることがある(scanf_s を推奨)

この教材では GCC を使っているので、まずは標準の scanf をそのまま使って大丈夫です。

補足(Visual C++で標準のscanfを使いたい場合)

本文にあるように、Visual C++ではコード先頭に次を書いて警告を抑える方法があります。

#define _CRT_SECURE_NO_WARNINGS

ただし、今の段階では無理に覚えなくてOKです。
GCCで学習しているなら、そのまま scanf を使って進めましょう。

今はどこまで理解できればOK?

scanf は、この先のC言語学習でとても大切な関数です。
でも最初から全部理解しようとすると大変なので、今は次の3点を押さえれば十分です。

1つ目:scanfでキーボード入力を受け取れる

実行中に数字を入力して、その値をプログラムで使えるようになります。

2つ目:入力された値は変数に入る

int で用意した変数に、scanf で値が入ります。

3つ目:printfの%dで表示できる

変数を printf に渡せば、入力した値を文章に埋め込んで表示できます。

この3つが分かっていれば、今の段階としては十分です。
細かい仕組みは、後の章で少しずつ理解していけば大丈夫です。

まとめ

このパートでは、scanf を使ってキーボードから整数を入力し、その値を printf で表示する方法を学びました。

  • scanf はキー入力を受け取る関数
  • %d で整数を読み取れる。
  • 変数の前に & を付ける。
  • 入力した値を printf の %d で表示できる。
  • 入力待ちになっても慌てなくてOK

ここまでできると、C言語のプログラムは「表示するだけ」から、「入力に応じて動く」段階に進みます。
次の学習では、入力と表示を組み合わせたプログラムがどんどん増えていくので、ぜひ数字をいろいろ変えながら試してみてください。