いまさら原因発見。でメモしてみる。 | hide789のblog

いまさら原因発見。でメモしてみる。

昔の宿題 で「Enterが残ってるのかしらん。」っていっていたのはどうやら正しかった模様。
手元のC言語の入門書より。

●改行文字が残る。
 scanf()で正しく入力しても最後の改行文字はバッファの中に残ります。そのためおかしな動作になることがあります。

林 晴比古 新・C言語入門 シニア編 pp335 

オマケの宿題の時はループの中でscanf()で文字を読み込んでいました。M/m/F/fが入力された場合はループを抜けて結果を表示して終了するので問題なかったのですが、scanf()で指定外の文字を入力した場合、指定外の文字と次の改行文字でループが2回回っていたようです。

結局scanf()で文字列を受け取るようにして、文字列の最初の文字で判断するようにして解決しました。文字列にすることで改行文字も文字列に収まり、ループが2回回ることがなくなったみたいです。

今回は文字を読み込むだけだったので、文字列で一緒くたに受け取ることができたけど、数字を読み込む場合はすべて文字列で受け取るのではなくて、数字を読み込む。その後の文字は読み捨てる。というようにする必要があるみたいです。

int a;
char dmyss[80];

scanf("%d", &a);
gets(dmyss);

めもめも。