MENU

【C言語】文字を入力してもscanfが終わらない原因と対処法

この記事では、C言語の入力処理で文字を入力してもscanfが終了しない問題の原因と対処法について解説します。

目次から探す

文字を入力してもscanfが終わらない原因

プログラミング初心者の方にとって、C言語の入力処理は最初のハードルとなることがあります。

特に、文字を入力してもscanfが終了しないという現象に遭遇することがあります。

バッファに残った改行文字が原因

scanf関数は、標準入力からデータを受け取る際に、バッファと呼ばれる一時的な領域にデータを格納します。

しかし、改行文字(‘\n’)などの特殊文字がバッファに残っている場合、scanfが終了しないことがあります。

例えば、以下のようなコードを考えてみましょう。

#include <stdio.h>
int main() {
    char name[20];
    int age;
    printf("名前を入力してください:");
    scanf("%s", name);
    printf("年齢を入力してください:");
    scanf("%d", &age);
    printf("名前:%s\n", name);
    printf("年齢:%d\n", age);
    return 0;
}

このコードでは、まず名前を入力するように要求し、次に年齢を入力するように要求しています。

しかし、実際にこのコードを実行してみると、名前の入力がスキップされてしまい、直接年齢の入力に移ってしまうことがあります。

この問題の原因は、名前の入力時に改行文字がバッファに残っているためです。

scanfは、文字列の入力を受け取る際に、改行文字を区切りとして認識します。

そのため、改行文字がバッファに残っていると、scanfは改行文字を文字列の一部として受け取り、まだ入力が必要な状態となります。

バッファのクリア方法

バッファに残った改行文字をクリアするためには、以下のような方法があります。

1. fflush関数を使用する方法

#include <stdio.h>
int main() {
    char name[20];
    int age;
    printf("名前を入力してください:");
    scanf("%s", name);
    fflush(stdin); // 標準入力のバッファをクリア
    printf("年齢を入力してください:");
    scanf("%d", &age);
    printf("名前:%s\n", name);
    printf("年齢:%d\n", age);
    return 0;
}

fflush関数を使用することで、標準入力のバッファをクリアすることができます。

これにより、改行文字がバッファに残らずに正常に入力を受け取ることができます。

2. getchar関数を使用する方法

#include <stdio.h>
int main() {
    char name[20];
    int age;
    printf("名前を入力してください:");
    scanf("%s", name);
    while (getchar() != '\n'); // 改行文字まで読み捨てる
    printf("年齢を入力してください:");
    scanf("%d", &age);
    printf("名前:%s\n", name);
    printf("年齢:%d\n", age);
    return 0;
}

getchar関数を使用することで、改行文字まで読み捨てることができます。

これにより、バッファに残った改行文字をクリアすることができます。

以上の方法を使用することで、文字を入力してもscanfが終了しない問題を解決することができます。

プログラミング初心者の方は、このような入力処理のトラブルに遭遇した際には、バッファの状態を確認して適切な対処法を選ぶようにしましょう。

上記の方法がうまく動作しない場合は、他の方法を試してみてください。

目次から探す