質問: 0; i
回答: 入力の最後、`5`に到達後に`EOF`が来ますが、その時の`gets()`呼出が失敗します。 しかし`buf`には前の入力結果`5`が残っており、これを処理しているので、最後だけ2回処理されています。 `gets(buf);` -> `if( !gets(buf)) break;`と変更すると意図どおりになります。