目次
1. scanf関数とは?
C言語を学ぶ上で、プログラムにデータを入力する方法としてよく使われるのがscanf関数です。これは、ユーザーが入力したデータを指定された変数に格納してくれる、プログラムにとっての「聞き役」のような存在です。
scanfの基本構文
scanf("フォーマット指定子", &変数);ここで重要なのは「フォーマット指定子」と「変数の前に付ける&」。フォーマット指定子は入力されるデータの種類を指定し、&はその変数のアドレスを示します。このルールを守ることで、scanfはユーザーからの入力を正しく処理できます。
int num;
scanf("%d", &num);このようにscanfは、プログラムに入力を与え、そのデータを使える状態にしてくれます。
2. よく使われるフォーマット指定子
%d:整数用%f:float型の浮動小数点数用%lf:double型の倍精度浮動小数点数用%s:文字列用(空白では区切られる)%c:単一の文字用
double val;
scanf("%lf", &val);3. 複数の入力を同時に処理する
int age;
float height;
scanf("%d %f", &age, &height);
printf("年齢: %d, 身長: %.2f\n", age, height);4. 入力のバリデーションとエラーハンドリング
int age;
printf("年齢を入力してください(0~120): ");
if (scanf("%d", &age) == 1 && age >= 0 && age <= 120) {
printf("入力された年齢は %d 歳です。\n", age);
} else {
printf("無効な年齢です。\n");
}5. 入力ストリームのクリア
scanfを使用していると、「前の入力が残っている」と感じる場合があります。これは、入力ストリームに改行文字(\n)などが残っているためです。
scanf("%*[^\n]");
scanf("%*c");これにより、入力バッファに残っている改行などを読み飛ばせます。ただし、ループ処理の途中ではfflush(stdin)は非標準のため避け、上記のような方法を使うのが安全です。
6. よくある落とし穴とベストプラクティス
- フォーマット指定子の一致:データ型と指定子を対応させる
- 文字列の長さに注意:
%s入力時はバッファサイズを考慮 - ストリームのクリア:改行文字を残さない
7. 応用編|scanfの高度な使い方
char name[20];
printf("名前を入力してください: ");
scanf("%19s", name); // バッファ安全対策
printf("こんにちは、%sさん!\n", name);まとめ
scanfはC言語における基本的な入力手段であり、フォーマット指定子・エラーチェック・入力ストリームの扱いを理解すれば安全に使えます。特に、入力バッファの残留とバッファオーバーフローに注意することが重要です。



