前章では printf() で画面に出力することを学んだ。
この章では scanf() を使って、キーボードからデータを受け取る方法を学ぶ。
キーボードからの入力を標準入力(standard input)と呼ぶ。
標準入力からデータを読み取る関数が scanf() である。
printf() と scanf() はちょうど対になっている。
| 関数 | 方向 | 役割 |
|---|---|---|
printf() | プログラム → 画面 | データを出力する |
scanf() | キーボード → プログラム | データを受け取る |
Visual Studio では scanf() を使うと、次のようなエラーが出てビルドできない場合がある。
error C4996: 'scanf': This function or variable may be unsafe.
これは Visual Studio のセキュリティ開発ライフサイクル(SDL)チェックという機能が、
古い関数の使用を警告しているためである。
この授業では scanf() をそのまま使えるよう、プロジェクトの設定を変更する。
scanf() の基本構文scanf("書式指定子", &変数名);
printf() との大きな違いが2つある。
| printf() | scanf() | |
|---|---|---|
| 変数の渡し方 | 変数名(値を渡す) |
&変数名(場所を渡す) |
| 書式指定子 | %d %f など |
%d %lf など(一部異なる) |
&(アンパサンド)は「変数のアドレス(場所)」を意味する。scanf() は「読み取った値をどこに入れるか」を知る必要があるため、| 型 | 書式指定子 | 注意 |
|---|---|---|
int | %d | |
double | %lf | printf では %f だが scanf では %lf |
float | %f | |
char | %c | |
文字列(char[]) | %s | 空白の手前まで読み取る |
double の読み取りには %lf を使う。printf では %f で表示できるが、scanf で %f を使うと正しく読み取れない。
#include <stdio.h>
int main(void)
{
int number;
printf("整数を入力してください: ");
scanf("%d", &number);
printf("入力された値は %d です¥n", number);
return 0;
}
実行例(42 と入力した場合):
整数を入力してください: 42 入力された値は 42 です
scanf() の前に printf() で入力を促すメッセージを表示するのが基本的なパターン。
#include <stdio.h>
int main(void)
{
int x, y;
printf("2つの整数を入力してください(スペースで区切る): ");
scanf("%d %d", &x, &y);
printf("x + y = %d¥n", x + y);
printf("x - y = %d¥n", x - y);
printf("x * y = %d¥n", x * y);
printf("x / y = %d¥n", x / y); /* y が 0 のときは注意 */
printf("x %% y = %d¥n", x % y);
return 0;
}
実行例(10 3 と入力した場合):
2つの整数を入力してください(スペースで区切る): 10 3 x + y = 13 x - y = 7 x * y = 30 x / y = 3 x % y = 1
y に 0 を入力するとゼロ除算が発生してプログラムが異常終了する(05章で確認済み)。
#include <stdio.h>
int main(void)
{
double height;
double weight;
printf("身長(cm)を入力してください: ");
scanf("%lf", &height); /* double は %lf で読み取る */
printf("体重(kg)を入力してください: ");
scanf("%lf", &weight);
printf("身長: %.1f cm¥n", height);
printf("体重: %.1f kg¥n", weight);
return 0;
}
実行例:
身長(cm)を入力してください: 170.5 体重(kg)を入力してください: 65.2 身長: 170.5 cm 体重: 65.2 kg
#include <stdio.h>
int main(void)
{
char name[20]; /* 最大19文字の文字列を格納できる配列 */
printf("名前を入力してください: ");
scanf("%s", name); /* 文字列は & 不要 */
printf("こんにちは、%s さん!¥n", name);
return 0;
}
実行例:
名前を入力してください: Taro こんにちは、Taro さん!
char[])は配列なので & を付けない。%s はスペースの手前まで読み取る。Yamada Taro のようにスペースを含む名前は途中で切れる。
一辺の長さを入力して、正方形の面積を表示するプログラムを作れ。
#include <stdio.h>
int main(void)
{
/* ここにコードを書く */
return 0;
}
実行例(5 と入力した場合):
一辺の長さを入力してください: 5 正方形の面積は 25 です
#include <stdio.h>
int main(void)
{
int side;
printf("一辺の長さを入力してください: ");
scanf("%d", &side);
printf("正方形の面積は %d です¥n", side * side);
return 0;
}
底辺と高さを入力して、三角形の面積を表示するプログラムを作れ。
面積の公式:底辺 × 高さ ÷ 2
#include <stdio.h>
int main(void)
{
/* ここにコードを書く */
return 0;
}
実行例(底辺 6.0・高さ 4.0 を入力した場合):
底辺を入力してください: 6.0 高さを入力してください: 4.0 三角形の面積は 12.00 です
double 型を使うscanf で double を読み取るときは %lfprintf で小数点以下2桁表示は %.2f2.0 で割ること(2 で割ると整数除算になる)#include <stdio.h>
int main(void)
{
double base, height, area;
printf("底辺を入力してください: ");
scanf("%lf", &base);
printf("高さを入力してください: ");
scanf("%lf", &height);
area = base * height / 2.0;
printf("三角形の面積は %.2f です¥n", area);
return 0;
}
名前と年齢を入力して、自己紹介文を表示するプログラムを作れ。
#include <stdio.h>
int main(void)
{
/* ここにコードを書く */
return 0;
}
実行例:
名前を入力してください: Hanako 年齢を入力してください: 18 私の名前は Hanako です。18歳です。よろしくお願いします。
#include <stdio.h>
int main(void)
{
char name[20];
int age;
printf("名前を入力してください: ");
scanf("%s", name);
printf("年齢を入力してください: ");
scanf("%d", &age);
printf("私の名前は %s です。%d歳です。よろしくお願いします。¥n", name, age);
return 0;
}
Q1. scanf() で変数に & を付ける理由として正しいものはどれか。
正解:イ
scanf() は読み取った値を「どこに入れるか」を知る必要があるため、変数のアドレスを渡す。& なしでは正しく動作しない。
Q2. double 型の変数を scanf() で読み取るとき、正しい書式指定子はどれか。
正解:ウ
scanf で double を読み取るときは %lf(エル・エフ)を使う。printf では %f でよいが、scanf では区別が必要。
Q3. 文字列を scanf() で読み取るとき、正しい書き方はどれか。
正解:イ
配列名はすでにアドレスを表しているため、& は不要。%s で文字列を読み取る。
Q4. scanf("%s", name); で "Yamada Taro" と入力したとき、name に入る文字列はどれか。
正解:イ
%s はスペースの手前まで読み取る。Yamada までが name に入り、Taro は読み取られない。
| 項目 | 内容 |
|---|---|
| SDL チェック | プロジェクトのプロパティで「いいえ」に設定する(1回だけ) |
scanf() の構文 | scanf("書式指定子", &変数名); |
& の意味 | 変数のアドレスを渡す。文字列(配列)には不要 |
| double の読み取り | %lf(printf は %f でよいが scanf は %lf) |
| 文字列の注意 | %s はスペースの手前まで。スペースを含む入力は読み取れない |