- 締切済み
C言語「K&R」の演習4-9について
K&Rの演習4-9について質問です。 問題文: われわれのgetchとungetchでは、押し戻されたEOFが正しく扱えない。 EOFが戻されたときにはどうすればよいかを考え、その設計に従ってプログラムを書け。 問題の意味がよく分からないんですが、この「われわれの」って本に出てくるサンプルコードのことですよね? で、コードを見たんですが、そもそもEOFを押し戻すことが発生しない、と思ったんですが、、、。 それに、EOFが現れると、プログラムが終了してしまうように思います。 どなたか、よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
noname#30727
回答No.2
EOFが戻された「とき」とあるのですから、それを否定しても始まりません。 EOFが正しく扱えないのには理由があります。 ヒント:なぜ getchar は int を返す関数なのか?
- chie65536
- ベストアンサー率41% (2512/6032)
回答No.1
演習問題は「getchからEOFが返されたあと、関数利用者がungetchを使ってEOFを押し戻したらどうすんの?今のままじゃEOFを押し戻されたらうまく動かないから、我々が作ったgetchとungetch関数そのものを、うまく動くように改造して直せ」って言ってる。 「そもそもEOFを押し戻すことが発生しない」とは何処にも書いてないし、サンプルコードも無関係。
質問者
お礼
早速解答していただきありがとうございます。 すみませんが、疑問点はクリアされませんでした。
お礼
回答していただきありがとうございます。 > なぜ getchar は int を返す関数なのか? 文字定数は int 型だから、でいいでしょうか。 質問した晩に本屋で、アンサーブックを見てきました。 バッファの配列の型を、char から int に変えるのが 答えでした。 自分は Win2k + Borland C++ Compiler の環境で作業 してますが、この環境では char 型のデフォルトは signed で、int への拡張は、符号拡張されるようです。 なので、実際にコンパイルしてテストしても、 動作しているので、問題文に疑問を持った次第です。 ------------------------------------------------- #include <stdio.h> #define BUFSIZE 100 int bufp = 0; char buf[BUFSIZE]; int getch(void) { return ((bufp > 0) ? buf[--bufp] : getchar()); } void ungetch(int c) { if (bufp >= BUFSIZE) printf("ungetch: too many characters\n"); else buf[bufp++] = c; } int main(void) { ungetch(EOF); printf("%d\n", getch()); return (0); } ------------------------------------------------- どうもありがとうございました。