【C言語】scanfで入力後、改行が残らないように対策する方法

この記事では、C言語においてscanf関数を使ってユーザーからの入力を受け取る際に生じる改行文字の問題について解説します。

目次から探す

scanf関数の仕様と問題点

C言語において、ユーザーからの入力を受け取る際には、scanf関数がよく使われます。

scanf関数は、指定したフォーマットに従って入力を受け取りますが、その際に改行文字も一緒に読み込んでしまうという問題があります。

int num;
printf("整数を入力してください:");
scanf("%d", &num);

この場合、ユーザーが 10 と入力した場合、scanf関数10 という整数を正しく読み込みますが、改行文字も読み込んでしまいます。

その結果、次の入力待ちの状態で改行文字が残ってしまうことになります。

この問題を解決するためには、いくつかの方法があります。

解決策1:改行文字を読み捨てる方法

改行文字を読み捨てる方法としては、主に以下の2つの方法があります。

fflush関数を使った改行文字の読み捨て

fflush関数を使うことで、入力バッファに残っている改行文字を読み捨てることができます。

int num;
printf("整数を入力してください:");
scanf("%d", &num);
fflush(stdin); // 入力バッファをクリアする

このようにすることで、改行文字が読み捨てられ、次の入力待ちの状態で改行文字が残らなくなります。

getchar関数を使った改行文字の読み捨て

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

int num;
printf("整数を入力してください:");
scanf("%d", &num);
getchar(); // 改行文字を読み捨てる

このようにすることで、改行文字が読み捨てられ、次の入力待ちの状態で改行文字が残らなくなります。

解決策2:入力バッファをクリアする方法

改行文字を読み捨てる方法ではなく、入力バッファ自体をクリアする方法もあります。

以下の2つの方法が一般的です。

getchar関数を使った入力バッファのクリア

getchar関数を使うことで、入力バッファをクリアすることができます。

int num;
printf("整数を入力してください:");
scanf("%d", &num);
while (getchar() != '\n'); // 入力バッファをクリアする

このようにすることで、改行文字を含む入力バッファがクリアされ、次の入力待ちの状態で改行文字が残らなくなります。

whileループを使った入力バッファのクリア

whileループを使って、入力バッファをクリアすることもできます。

int num;
printf("整数を入力してください:");
scanf("%d", &num);
int c;
while ((c = getchar()) != '\n' && c != EOF); // 入力バッファをクリアする

このようにすることで、改行文字を含む入力バッファがクリアされ、次の入力待ちの状態で改行文字が残らなくなります。

解決策3:fgets関数を使う方法

scanf関数ではなく、fgets関数を使うことで、改行文字の問題を回避することもできます。

fgets関数は、指定した文字数までの文字列を受け取ることができます。

char input[100];
printf("文字列を入力してください:");
fgets(input, sizeof(input), stdin); // 改行文字も含めて読み込む

このようにすることで、改行文字を含む文字列を正しく読み込むことができます。

ただし、fgets関数は改行文字も含めて読み込むため、必要に応じて改行文字を削除する処理を追加する必要があります。

改行文字の問題を回避するためには、適切な方法を選んで実装してください。

目次から探す