【C言語】2回目のscanfが飛ばされる原因と対処法

バッファに残った改行文字や前回の入力値が原因で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が飛ばされることがあるので、バッファのクリアや書式指定子の修正を行うて対処するようにしましょう。

目次から探す