この記事では、C言語において複数のscanf関数
を連続して呼び出す際に生じる問題点と、それを解決するためのバッファのクリア方法について解説します。
複数のscanf関数を連続して呼び出す際の問題点
C言語において、複数のscanf関数
を連続して呼び出す場合には、バッファの問題が発生することがあります。
scanf関数
は、ユーザーからの入力を受け取る際に、入力バッファにデータを格納します。
しかし、連続してscanf関数
を呼び出すと、前のscanf関数
が残した改行文字や空白文字などが次のscanf関数
に影響を与えることがあります。
バッファの問題
例えば、以下のようなコードを考えてみましょう。
#include <stdio.h>
int main() {
int num1, num2;
printf("1つ目の数値を入力してください: ");
scanf("%d", &num1);
printf("2つ目の数値を入力してください: ");
scanf("%d", &num2);
printf("入力された数値は %d と %d です。\n", num1, num2);
return 0;
}
このコードでは、ユーザーに2つの数値を入力してもらい、それを表示するプログラムです。
しかし、実際にこのコードを実行してみると、2つ目の数値の入力がスキップされてしまうという問題が発生します。
これは、1つ目のscanf関数
が改行文字を残してしまい、2つ目のscanf関数
がそれを読み取ってしまうためです。
つまり、1つ目のscanf関数
が改行文字を読み取った後、2つ目のscanf関数
は改行文字を入力として受け取り、数値の入力を待たずにスキップしてしまうのです。
バッファのクリア方法
このような問題を解決するためには、バッファをクリアする必要があります。
バッファをクリアする方法はいくつかありますが、以下の2つの方法が一般的です。
fflush関数
を使用する方法getchar関数
を使用する方法
1. fflush関数を使用する方法
fflush関数
は、指定したストリームのバッファをクリアするために使用されます。
具体的には、標準入力ストリーム(stdin)のバッファをクリアすることで、前のscanf関数
が残した改行文字を取り除くことができます。
#include <stdio.h>
int main() {
int num1, num2;
printf("1つ目の数値を入力してください: ");
scanf("%d", &num1);
fflush(stdin); // 標準入力ストリームのバッファをクリア
printf("2つ目の数値を入力してください: ");
scanf("%d", &num2);
printf("入力された数値は %d と %d です。\n", num1, num2);
return 0;
}
このように、fflush関数
を使用することで、バッファのクリアが行われ、連続してscanf関数
を呼び出す際の問題を解決することができます。
2. getchar関数を使用する方法
getchar関数
は、1文字ずつ入力を受け取るための関数です。
この関数を使用して、改行文字を読み取ることでバッファをクリアすることができます。
#include <stdio.h>
int main() {
int num1, num2;
char c;
printf("1つ目の数値を入力してください: ");
scanf("%d", &num1);
while ((c = getchar()) != '\n' && c != EOF); // 改行文字を読み取り、バッファをクリア
printf("2つ目の数値を入力してください: ");
scanf("%d", &num2);
printf("入力された数値は %d と %d です。\n", num1, num2);
return 0;
}
このように、getchar関数
を使用して改行文字を読み取ることで、バッファのクリアが行われます。
バッファに残った改行文字を取り除くことで、連続してscanf関数
を呼び出す際の問題を解決することができます。
以上が、複数のscanf関数
を連続して呼び出す際の問題点と、バッファのクリア方法です。
バッファの問題に注意しながら、正しくscanf関数
を使用することで、スムーズなユーザー入力を実現しましょう。