K&;R C练习4-9:为什么忽略EOF?

K&;R C练习4-9:为什么忽略EOF?,c,push-back,C,Push Back,只是有点困惑,我希望有人能澄清-这个问题问: “我们的getch和ungetch不能正确处理被推后的EOF。如果EOF被推后,确定它们的属性应该是什么,然后实现您的设计” 按原样编写代码时,会向后推一个EOF,并用getch()重新蚀刻,这会导致如下循环: while ((c = getch()) != EOF) putchar(c); 当从缓冲区遇到它时终止。我看不出这种行为怎么是不正确的。当然,理论上(大多数情况下)EOF只会遇到一次,如果它被向后推,然后以这种方式从缓冲区中读取,

只是有点困惑,我希望有人能澄清-这个问题问: “我们的getch和ungetch不能正确处理被推后的EOF。如果EOF被推后,确定它们的属性应该是什么,然后实现您的设计”

按原样编写代码时,会向后推一个EOF,并用getch()重新蚀刻,这会导致如下循环:

while ((c = getch()) != EOF)
    putchar(c);
当从缓冲区遇到它时终止。我看不出这种行为怎么是不正确的。当然,理论上(大多数情况下)EOF只会遇到一次,如果它被向后推,然后以这种方式从缓冲区中读取,这真的不重要吗?我希望有人能帮我弄清楚这个问题的目的——我知道大多数解决方案都涉及到编程ungetch()来忽略EOF,我只是不明白这有什么意义

我肯定有一个,因为丹尼斯·里奇和布赖恩·克尼汉比我这个小老头聪明多了——只是希望有人能指出这一点。谢谢:-)

问候,,
Phil

buf的定义是
charbuf[BUFSIZE],根据本书第19页的内容:

我们必须声明c是一个足够大的类型,可以容纳任何 getchar返回。我们不能使用char,因为c必须足够大才能容纳 除了任何可能的字符外,还有EOF。因此我们使用int

然后我们得到了答案:

int buf[BUFSIZE];

确切地EOF不是一个字符。@Tsukuyo是的,它是一个区别于字符的值。我确实想到了这一点,但没有想到它-我假设cygwin(我当前的环境)使用带符号的字符,因为我能够存储EOF值(-1)在缓冲区中检索它就可以了?好吧-我想我之所以能够毫无问题地体验到正确的行为,是因为GCC默认使用带符号的字符,所以将(int)-1截断为(char)-1是正确的。这种行为依赖于机器,因此我将使用您建议的修改。谢谢:-)因此,如果您在((c=getch())!=EOF)
时执行
,并且
c
char
,那么如果代码读取
\xff
字符,您的循环将错误终止,因为它会将其误认为EOF。