关于C (K&R) 中getchar 和putchar 的问题

Questions regarding getchar and putchar in C (K&R)

所以我正在按照 Dennis Ritchie 和 Brian Kernighan 的书 'The C Programming Language 2nd Edition' 学习 C。在1.5.1 File Copying节中,显示以下程序:

#include <stdio.h>

/* copy input to output; 1st version */
main()
{
    int c;
    
    c = getchar()
    while (c != EOF) {
        putchar(c);
        c = getchar();
    }
}

我在这里有几个问题。

  1. 为什么变量 c 声明为 int?因为它是一个 getchar() 函数,它不应该是 char 类型吗?
  2. putcharprintf有什么区别?
  3. 我不明白 while 循环条件中提到的 EOF 是什么

谢谢!

  • char 只是一个 7 位数。计算机使用计算机使用的任何字符编码(主要是 ASCII)将这些数字编码为字符。大多数 C 库函数甚至使用 int 来做一些与处理字符相关的事情。在这种情况下,getchar() returns 和 int,因此在这种情况下使用 int 是有意的。

  • putchar() 只是根据输入值打印一个字符,而 printf() 可以做任何你喜欢的事情。

  • EOF(“文件结束”)字符在没有更多输入时收到。while (c != EOF) 如果我们收到 EOF 将退出循环

  1. Why is the variable c declared as an int? Because it's a getchar() function shouldn't it be of type char?

getchar 不能 return 只是 char 因为它需要 return 一个字符(如果操作成功)或 EOF(如果操作成功失败)。

因此 getchar return 是 int。如果操作成功读取一个字符,它 return 将该字符作为 unsigned char 值。 (这是字符操作应该更喜欢使用 unsigned char 类型的原因之一。避免使用 char。)如果操作没有读取字符,要么是因为输入中没有更多字符流或因为发生错误,则 getchar returns EOFEOF 有一些负值,所以它总是不同于 unsigned char 值。

如果将 getchar 的结果分配给 charint 值将转换为 char。在典型的 C 实现中,getchar 有 257 个可能的 return 值—256 个字符值和一个 EOF 值,但 char 只有 256 个可能的值。因此,转换会将至少两个不同的值映射到同一事物,通常是 EOF 和其他一些字符。那么就不可能将这两件事与 char 值区分开来。您需要使用 int 来保留原始 getchar return 值。

  1. What is the difference between putchar and printf?

putchar 将单个字符发送到标准输出流。

printf 执行格式化操作并将结果发送到标准输出流。即使在最简单的情况下 printf 只给出了一个没有要转换的参数的格式字符串,它仍然是一个字符串,而不是单个字符。

  1. I don't get what is the EOF mentioned in the condition of the while loop

EOF 代表“文件结尾”,但如果到达流的末尾或发生错误,则 return by getchar