この記事では、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関数
は改行文字も含めて読み込むため、必要に応じて改行文字を削除する処理を追加する必要があります。
改行文字の問題を回避するためには、適切な方法を選んで実装してください。