【问题标题】:K&R C Exercise 4-9: Why ignore EOF?K&R C 练习 4-9:为什么忽略 EOF?
【发布时间】:2013-09-15 23:00:22
【问题描述】:

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

在代码原样的情况下,一个 EOF 被推回,用 getch() 重新获取,这会导致一个循环,例如:

while ((c = getch()) != EOF)
    putchar(c);

在从缓冲区遇到它时终止。我看不出这种行为是如何不正确的。当然,理论上(大多数情况下)EOF只会遇到一次,如果它被推回然后以这种方式从缓冲区中读取,那真的没关系吗?我希望有人能为我澄清这个问题的目的 - 我知道大多数解决方案都涉及编程 ungetch() 以忽略 EOF,我只是不明白这一点。

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

问候, 菲尔

【问题讨论】:

    标签: c push-back


    【解决方案1】:

    buf的定义是char buf[BUFSIZE];,根据书中第19页的内容:

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

    然后我们得到答案:

    int buf[BUFSIZE];
    

    【讨论】:

    • 没错。 EOF 不是字符。
    • @Tsukuyo 是的,这是一个区分字符的值。
    • 我确实想到了这一点,但没有想到 - 我假设 cygwin(我当前的环境)使用带符号的字符,因为我能够在缓冲区中存储 EOF 值(-1)并检索它好吗?
    • 好的 - 我认为我遇到正确行为而没有问题的原因是 GCC 默认使用带符号的字符,因此将 (int)-1 截断为 (char)-1 是正确的。这种行为取决于机器,所以我将使用您建议的修改。谢谢:-)
    • 因此,如果您正在执行while ((c = getch()) != EOF) 并且cchar,那么如果您的代码读取\xff 字符,您的循环将错误地终止,因为它会将其误认为是一个EOF。
    猜你喜欢
    • 2020-06-25
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2010-09-29
    相关资源
    最近更新 更多