標準入力用バッファをフラッシュします.scanf 関数を実行すると,改行文字( '\n' )がバッファに残ります.そのため,「2)文字列を入力してください:」に応じて入力しようとしても,次の gets 関数がバッファに残っている改行文字を読み込んで,それを出力( printf 関数)してしまうため,次の入力を促すメッセージ(「3)文字列を入力してください:」)が出力されてしまいます.しかし,このメッセージに対応した入力を読み込んだあとで,fflush 関数を使用しているため,次の gets 関数は期待通りの処理を行っています.
#include <stdio.h>
int main()
{
char str[81];
/*
fflush関数を使用しない場合
*/
printf("1)文字列を入力してください:");
scanf("%s", str);
printf(" %s\n", str);
printf("2)文字列を入力してください:");
gets(str);
printf(" %s\n", str);
/*
fflush関数を使用する場合
*/
printf("3)文字列を入力してください:");
scanf("%s",str);
printf(" %s\n", str);
fflush(stdin);
printf("4)文字列を入力してください:");
gets(str);
printf(" %s\n", str);
return 0;
}
(出力)
1)文字列を入力してください:aaa
aaa
2)文字列を入力してください:
3)文字列を入力してください:bbb
bbb
4)文字列を入力してください:ccc
ccc