バッファに残った改行文字や前回の入力値が原因でscanf
が飛ばされることがあるため、初心者の方にとって重要なポイントです。
この記事では、C言語において2回目のscanf
が飛ばされる原因と、その対処法について解説します。
2回目のscanfが飛ばされる原因
C言語において、2回目のscanf
が飛ばされる原因はいくつかあります。
以下にその原因と対処法を解説します。
バッファに残った改行文字の影響
scanf関数
は、入力バッファからデータを読み込む際に、改行文字(Enterキーによって入力される\n
)も読み込みます。
しかし、改行文字は文字として扱われるため、次のscanf
で文字列や数値を読み込む際に問題が生じることがあります。
例えば、以下のようなコードを考えてみましょう。
int num;
char str[100];
printf("整数を入力してください: ");
scanf("%d", &num);
printf("文字列を入力してください: ");
scanf("%s", str);
この場合、最初のscanf
で整数を入力する際にEnterキーを押すと、改行文字がバッファに残ります。
そして、次のscanf
で文字列を入力する際に、改行文字が読み込まれてしまい、意図した入力ができなくなります。
前回のscanfで入力された値がバッファに残っている場合
scanf関数
は、入力バッファに残っているデータを読み込むため、前回のscanf
で入力された値がバッファに残っている場合にも、2回目のscanf
が飛ばされることがあります。
例えば、以下のようなコードを考えてみましょう。
int num1, num2;
printf("整数を2つ入力してください: ");
scanf("%d", &num1);
scanf("%d", &num2);
この場合、最初のscanf
で整数を入力する際に、2つの整数を連続して入力すると、2回目のscanf
が飛ばされてしまいます。
これは、2つ目の整数を入力する際に、バッファに残っている改行文字が読み込まれるためです。
対処法1: バッファのクリア
2回目のscanf
が飛ばされる原因の1つであるバッファに残った改行文字の影響を解消するためには、バッファをクリアする必要があります。
バッファをクリアするためには、scanf
の直後にgetchar関数
を呼び出すことで、改行文字を読み捨てることができます。
int num;
char str[100];
printf("整数を入力してください: ");
scanf("%d", &num);
getchar(); // バッファの改行文字を読み捨てる
printf("文字列を入力してください: ");
scanf("%s", str);
このようにすることで、バッファに残った改行文字の影響を受けずに、意図した入力を行うことができます。
対処法2: scanfの書式指定子の修正
2回目のscanf
が飛ばされる原因のもう1つは、前回のscanf
で入力された値がバッファに残っている場合です。
この場合、scanf
の書式指定子を修正することで、バッファに残った値を読み込むことができます。
スペースを挿入することで改行文字を読み飛ばす方法
改行文字を読み飛ばすためには、scanf
の書式指定子の前にスペースを挿入することで対処することができます。
int num1, num2;
printf("整数を2つ入力してください: ");
scanf("%d", &num1);
scanf(" %d", &num2); // スペースを挿入して改行文字を読み飛ばす
このようにすることで、バッファに残った改行文字を読み飛ばすことができます。
%c書式指定子を使って改行文字を読み込む方法
もう一つの方法は、%c
書式指定子を使って改行文字を読み込む方法です。
int num1, num2;
char newline;
printf("整数を2つ入力してください: ");
scanf("%d", &num1);
scanf("%c", &newline); // 改行文字を読み込む
scanf("%d", &num2);
このようにすることで、%c
書式指定子を使って改行文字を読み込むことができます。
これにより、バッファに残った改行文字を読み込むことなく、意図した入力を行うことができます。
バッファに残った改行文字や前回の入力値が原因でscanf
が飛ばされることがあるので、バッファのクリアや書式指定子の修正を行うて対処するようにしましょう。