【C言語】scanfを2つ連続で呼び出す際の注意点を解説

この記事では、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つの方法が一般的です。

  1. fflush関数を使用する方法
  2. 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関数を使用することで、スムーズなユーザー入力を実現しましょう。

目次から探す