【问题标题】:Program prints garbage upon EOF [duplicate]程序在 EOF 上打印垃圾 [重复]
【发布时间】:2019-07-12 17:54:50
【问题描述】:

我正在阅读 K&R 书籍并实施了“复制”示例:

#include <stdio.h>

int main() {
    char c;
    while ((c = getchar()) != EOF) {
        putchar(c);
    }
    return 0;
}

所有正常输入似乎都可以正常工作,但是当输入 EOF (^D) 时,程序会打印无限的“�”字符,我必须手动停止程序。

我尝试过使用putchar(c);printf("%c", c); 来达到同样的效果。

有人知道这是什么原因吗?

【问题讨论】:

  • 应该是int c;。这真的是 K&R 的原样吗?
  • 这是正确的,不,我复制错了。

标签: c


【解决方案1】:

由于c 属于char 类型,从getchar 返回的int 值将在与EOF 进行比较之前转换为char 类型。

由于EOF 是一种带内错误机制,它必须是一个可以与所有可以返回的有效字符区分开来的错误值。当您将 EOF 分配给 char 时,您会丢弃信息。

执行后:

char c = EOF;

声明

c == EOF

是假的。

保留getchar的返回类型:

int c;

代替:

char c;

【讨论】:

    【解决方案2】:

    使用int c 而不是char c 应该可以解决您的问题

    【讨论】:

      猜你喜欢
      • 2013-10-23
      • 2016-04-30
      • 2019-05-09
      • 1970-01-01
      • 2016-04-15
      • 2019-11-26
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多