目標
標準入力を用い、数値の入力ができるようになる。
標準入力の利用
scanf (スキャンエフ) 関数を利用することで標準入力から入力できます。
具体例を見てもらうのが手っ取り早いと思うので、以下の例をご覧ください。
int a;
scanf("%d", &a);
printf("%d\n", a);
はじめの行で、利用する変数を宣言しています。
そして、その次に scanf 関数を使って入力を行なっています。
最後の行では、入力した数値を printf 関数で表示し、入力ができているか確認をしています。
scanf 関数は次のような形式で利用します。
scanf("フォーマット文字列", &変数1, &変数2, ...);
上を見て、なにかと似ていると思いませんか?
そう、printf 関数とそっくりなのです。
しかし、大きく違う所が1つあります。
それは、変数名の前に&がついているところです。
この & には意味があるのですが、これについて扱うのはしばらく先になります。
そのため、とりあえずは scanf 関数を利用するときには、変数の前に & を付けないといけないと覚えてください。
あと、最後に改行がないことにも注目してください。
scanf 関数では改行は必要ありません。
ただし、ユーザーは入力後に改行をする必要があります。
scanf 関数の使用例
printf 関数と違って、scanf 関数は書式などを気にしなくていい場合が多いので、
scanf 関数のほうが使うのは楽だと思います。
以下は、型別の使用例になります。
入力はすべて、10進数でされるとします。
例
int a;
double b;
scanf("%d", &a);
scanf("%lf", &b);
char 型の扱い
char 型の入力は特殊なため、今回は扱いません。
文字列の所で扱うので、それまで待ってください。
double 型の入力
double 型は printf 関数では %f でしたが、scanf 関数では %lf となります。
これはよく間違えられるので、注意してください。
- [迷信] double の出力書式は "%lf"
http://www.kijineko.co.jp/tech/superstitions/printf-format-for-double.html
10進数以外での読み込み
もちろん、10進数以外でも入力ができます。
しかし、人間が入力する場合は 10 進数が多いのではないかと思います。
以下は 16 進数での入力の例です。
int a;
scanf("%x", &a);
入力した数値を利用する
数値を入力したとしても、実際に利用しなければ意味がありません。
scanf 関数で入力した数値は、変数に代入したときと同じように扱うことができます。
例
整数を2つ入力して、その和を表示する。
int a, b;
scanf("%d", &a);
scanf("%d", &b);
printf("%d\n", a + b);
printf 関数のように、次のようにして一度に2つの数値を入力することもできます。
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", a + b);
補足
では、次のプログラムに対して2つの数値を入力すると何が表示されるでしょう?
int a;
scanf("%d", &a);
printf("%d\n", a);
この場合、最初に入力された数値が a に格納されてそれが表示され、残りはバッファと呼ばれるところに保存されます*1。
この次に scanf が呼び出された場合、バッファに残っていたらそれを先頭から読み込み、バッファが空、もしくは scanf に渡された引数の数より少ない場合は足りない数だけ入力を求めます。
scanf 関数以外の標準入力関数
scanf 関数以外にも標準入力から入力する関数がありますが、今回は扱いません。
理由は、まだ教えていない文字列の扱いに関する知識が必要だからです。
課題
課題1
int 型の変数 a, b を宣言しなさい。
次に、標準入力から2つの整数 (10進数) を変数 a, b に読み込み、その積を表示しなさい。
実行例
5 3 がユーザーの入力、15 がプログラムの出力です。
./a.out 5 3 15
課題2
四則演算 の課題2で製作したプログラムを改造し、a, b, c を固定ではなく、標準入力から与えるようにしなさい。
実行例
1 1 -6 がユーザーが入力したもの、2.000000 -3.000000 がプログラムの出力です。
./a.out 1 1 -6 2.000000 -3.000000
挑戦課題
- AOJ 10001: X Cubic
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10001
- AOJ 10002: Rectangle
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10002
- AOJ 10008: A / B Problem
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10008
- AOJ 10009: Circle
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=10009