*scanf関数 [#s7a5a60d]
キーボードからデータを入力するには、''scanf関数''を使います。
scanf関数も、printf関数と同様に、標準入出力ライブラリーのヘッダー・ファイル ''stdio.h'' の中に定義されていて、このライブラリーを読み込まないと使えません。
scanfは、''scan formatted''を表していて、書式付き入力という意味です。
scanf関数は、( ) の中に下で説明する変換指定子を含む文字列と入力された値を格納する変数の名前を指定します。
ただし、変数の名前の前にアンパサンド ''&'' を付けます。
#geshi(c){{
scanf(文字列, &変数);
}}
*変換指定子 [#xed19621]
scanf関数の中で入力されるデータの書式(フォーマット)を指定するものも''変換指定子''といいます。
変換指定子は、パーセント ''%'' で始まる文字列で表されます。
**整数を入力する [#t6f39872]
整数を入力するときは、整数を出力するときと同じ ''%d'' を変換指定子として使います。
次のプログラムは、キーボードから入力された整数をそのまま出力するプログラムです(プログラム1)。
#geshi(c){{
#include <stdio.h>
int main(void) {
int i;
scanf("%d", &i);
printf(">> %d\n", i);
return 0;
}
}}
このプログラムを実行し、キーボードから123と入力すると、次のように表示されます。
#geshi(sh){{
luna% a.out
123
>> 123
}}
ここで、2行目はキーボードから入力した部分です。
**演習1 [#o16942c3]
プログラム1を作成し、実行結果を確認せよ。
**小数を入力する [#u78f4677]
小数を入力するときは、小数を出力するときは違って、''%lf''(パーセント・小文字のエル・小文字のエフ)を変換指定子として使います。
%f ではないことに注意しましょう。
次のプログラムは、キーボードから入力された小数をそのまま出力するプログラムです(プログラム2、一部のみ)。
#geshi(c){{
double d;
scanf("%lf", &d);
printf(">> %f\n", d);
}}
このプログラムを実行し、キーボードから123.45と入力すると、次のように表示されます。
#geshi(sh){{
luna% a.out
123.45
>> 123.450000
}}
**演習2 [#secfd8ad]
プログラム1をプログラム2に変更し、実行結果を確認せよ。
*複数の値を入力する [#o6c0d7f9]
複数の値を入力するときは、scanf関数に指定する文字列の中に変換指定子を複数含め、同じ数だけ入力された値を格納する変数の名前を指定します。
#geshi(c){{
scanf(文字列, &変数1, &変数2, ...);
}}
次のように、文字列に変換指定子だけを指定しているときは、空白、タブ、改行で区切って入力します(プログラム3、一部のみ)。
#geshi(c){{
int i, j;
scanf("%d%d", &i, &j);
printf(">> %d\n", i);
printf(">> %d\n", j);
}}
これを実行し、123と456を入力すると、次のように表示されます。
#geshi(sh){{
luna% a.out
123
456
>> 123
>> 456
}}
2行目と3行目がキーボードから入力した部分です。
同じプログラムを実行し、値を空白で区切って入力しても、同じように表示されます。
#geshi(sh){{
luna% a.out
123 456
>> 123
>> 456
}}
2行目がキーボードから入力した部分です。
また、指定変換子の間に''区切り文字''を指定することもできます(プログラム4、一部のみ)。
#geshi(c){{
scanf("%d,%d", &i, &j);
}}
#geshi(sh){{
luna% a.out
123,456
>> 123
>> 456
}}
これも2行目がキーボードから入力した部分です。
**演習3 [#cdffb5e3]
プログラム1をプログラム3とプログラム4に変更し、実行結果を確認せよ。
----
*入力ミス(おまけ) [#f06a767a]
変換指定子で指定された書式と異なるデータを入力すると、実行したときに正しい結果が得られません。
コンパイル時も実行時もエラーにならず、正しく動いたように見えてしまうので注意しましょう。
**大きな数を入力する [#f5b8edd4]
指定されたデータ型に入りきらない大きな数を入力すると、オーバーフローが生じます。
プログラム1を実行し、int型の最大より1だけ大きい数を入力すると、次のようになります。
#geshi(sh){{
luna% a.out
2147483648
>> -2147483648
}}
**数値以外のものを入力する [#mcf32b76]
数値以外のものを入力すると、先頭が数値の場合は数値として認識できるところまで、そうでない場合は0が変数に格納されます。
プログラム1を実行し、123AやA123と入力すると、次のようになります。
#geshi(sh){{
luna% a.out
123A
>> 123
luna% a.out
A123
>> 0
}}
**間違った区切り文字を入力する [#m596b9ca]
指定された区切り文字と異なる文字で区切って入力すると、間違った区切り文字以後の値が0になります。
プログラム4を実行し、指定されているコンマ , の代わりに空白で区切って入力すると、次のようになります。
#geshi(sh){{
luna% a.out
123 456
>> 123
>> 0
}}
**演習4 [#g44d4add]
プログラム1とプログラム4を実行し、入力ミスを起こしてその結果を確認せよ。
----
*まとめ [#w4725624]
キーボードからの入力には''scanf関数''を使います。
printf関数と同じように変換指定子を用いて書式を指定しますが、double型のときは %f ではなく ''%lf'' を指定します。
scanf関数では、入力された値を格納する変数名の前にアンパサンド ''&'' をつけます。
----
*練習問題 [#w1a27032]
**04B-1 int型の入力(難易度★) [#td63a1e5]
次の空欄部分を補って、int型の値をキーボードから読み込んで変数 x に格納し、画面に表示するプログラムを完成させよ。
#geshi(c){{
int main(void) {
int x;
scanf(" ", );
printf(">> %d\n", x);
return 0;
}
}}
***04B-1 解答例 [#gdb104e5]
解答例は[[こちら>授業/C言語基礎/04B-1]]
**04B-2 double型の入力(難易度★) [#o7588a5e]
次の空欄部分を補って、double型の値をキーボードから読み込んで変数 x に格納し、画面に表示するプログラムを完成させよ。
#geshi(c){{
int main(void) {
double x;
scanf(" ", );
printf(">> %f\n", x);
return 0;
}
}}
***04B-2 解答例 [#u7c6a7d5]
解答例は[[こちら>授業/C言語基礎/04B-2]]
練習問題は[[こちら>授業/C言語基礎/キーボードからの入力/練習問題]]。