• 締切済み

C言語「K&R」の演習4-9について

K&Rの演習4-9について質問です。 問題文: われわれのgetchとungetchでは、押し戻されたEOFが正しく扱えない。 EOFが戻されたときにはどうすればよいかを考え、その設計に従ってプログラムを書け。 問題の意味がよく分からないんですが、この「われわれの」って本に出てくるサンプルコードのことですよね? で、コードを見たんですが、そもそもEOFを押し戻すことが発生しない、と思ったんですが、、、。 それに、EOFが現れると、プログラムが終了してしまうように思います。 どなたか、よろしくお願いします。

みんなの回答

noname#30727
noname#30727
回答No.2

EOFが戻された「とき」とあるのですから、それを否定しても始まりません。 EOFが正しく扱えないのには理由があります。 ヒント:なぜ getchar は int を返す関数なのか?

Gimli
質問者

お礼

回答していただきありがとうございます。 > なぜ 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); } ------------------------------------------------- どうもありがとうございました。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

演習問題は「getchからEOFが返されたあと、関数利用者がungetchを使ってEOFを押し戻したらどうすんの?今のままじゃEOFを押し戻されたらうまく動かないから、我々が作ったgetchとungetch関数そのものを、うまく動くように改造して直せ」って言ってる。 「そもそもEOFを押し戻すことが発生しない」とは何処にも書いてないし、サンプルコードも無関係。

Gimli
質問者

お礼

早速解答していただきありがとうございます。 すみませんが、疑問点はクリアされませんでした。

関連するQ&A