WisdomSoft - for your serial experiences.

2.8 データの入力

scanf() 関数を用いてキーボードから入力した任意の値を受け取る方法を解説します。

2.8.1 ユーザーの入力を受け取る

これまでのプログラムでは、変数に定数を代入してきましたが、実際のプログラムではこれほど無意味な行為はありません。実行時に動的に変化する不定な値だからこそ、変数を使う意味があります。常に同じ値を画面に表示させたいならば、直接定数を指定すればよいだけのことです。

では、「実行時に動的に変化する値」とはどのように取得するべきなのでしょうか?ひとつはディスクファイルなどからデータを取得する方法が考えられます。例えば、テキストファイルを入力してそれを画面に表示するならば、それは実行時に動的に変化する値といえるでしょう。しかし、ディスクファイルを読み取るというプログラムは中級レベルの作業になるので、この場では説明できません。C言語の基礎を網羅してから、後半で解説します。

では、もっと簡単にデータを入力する方法がないものでしょうか?プログラムの実行中にキーボードから文字や数字を入力することができれば、プログラムの可能性も大幅に広がりますし、今後のプログラムのテストもより柔軟に行えるようになるでしょう。キーボードから値をインプットするには scanf() 関数を使用します。scanf() 関数は printf() 関数の入力版で、指定した変数に対してキーボードから値を入力します。

scanf() 関数
int scanf ("フォーマット" , &変数名);

scanf() 関数の第一引数には書式制御を、第2引数以降にはインプットされた値を格納する変数を指定します。書式制御は基本的に printf() 関数と同じものと考えてかまいません。数値を入力するのであれば %d を、文字を入力するのであれば %c を指定するという感じです。第2引数以降は書式制御のフォーマット文字に対応した変数を指定するのですが、ただ単純に変数を指定するのではなく、変数名の前に & を指定します。

なぜ変数の前に & をつける必要があるのかというと、これは関数に変数のアドレスを通知する必要があるからです。これについてはポインタについて詳しく知る必要があるのですが、この場ではキーボードからインプットする場合は scanf() 関数を使うということと、書式制御のフォーマット文字に対応した変数を指定するときは、変数名の前に & をつけるということさえ注意すればよいでしょう。この & の意味はポインタを学習した時に理解することができます。

scanf () 関数は、正しく変換され、変数に代入されたフォーマットの数を返します。

コード1
#include <stdio.h>

int main() {
	int iVar = 0;

	printf("整数値を入力してください>");
	scanf("%d" , &iVar);

	printf("入力された値は %d です\n" , iVar);
	return 0;
}
実行結果
コード1 実行結果

コード1を実行すると、値を入力するように求められます。整数値を入力すれば iVar 変数に入力した値が代入され、画面に数値が表示されるでしょう。正しい値が入力されなかった場合は変換することができないため、変数に値は代入されません。

実践レベルの問題を考えれば、実は scanf() 関数が使われることは滅多にありません。理由はエラーチェックが十分にできないからです。十分なエラーチェックを行う必要がある入力は(商用のプログラムは十分なエラーチェックが必要であり、結果として本格的なプログラムには scanf() をあまり使わない)変換作業を行わずに、他の標準入力関数を用いて文字列として入力された情報を受け取り、入力された文字列を調べて適切な値に変換するというような作業を行います。もちろんこれらの作業は複雑になります。そのため、本書では入力作業は scanf() 関数を用いて作業を簡略化します。