【问题标题】:Questions regarding getchar and putchar in C (K&R)C (K&R) 中关于 getchar 和 putchar 的问题
【发布时间】:2021-12-15 00:36:42
【问题描述】:

所以我是按照 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(同样,“数字”是int)。几乎每个涉及将字符作为参数或返回字符的 C 库函数都使用int。在getchar() 的情况下,我们需要区分数据0xFF 和标志EOF (-1)。该标志不是数据,而是没有更多输入的信号(文件结束)。另外,如果您查看sizeof 'a',您会发现它不是1,而是与sizeof (int) 相同。
  • 对了,那个变量被声明为int,这样就可以检查它是否等于EOF,而EOF是-1
  • 是的,函数声明是int getchar(void);
  • 哦,好的,谢谢!

标签: c getchar kernighan-and-ritchie putchar


【解决方案1】:
  1. 为什么变量c 声明为int?因为它是一个getchar() 函数,它不应该是char 类型吗?

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

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

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

  1. putcharprintf 有什么区别?

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

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

  1. 我不明白while 循环条件中提到的EOF 是什么

EOF 代表“文件结束”,但如果到达流的末尾或发生错误,则由getchar 返回。

【讨论】:

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

    • putchar() 只需根据输入值打印一个字符,而printf() 可以为所欲为。

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

    【讨论】:

    • 所以,我假设 EOF 类似于 ctrl+c?
    • Linux 上是 Ctrl-D,Windows 上是 Ctrl-Z。但是 Ctrl-C 的处理方式不同。它结束程序,而不是输入。
    • 重要的是要意识到 C 中的 EOF 值与在终端键入以指示文件结束的字符无关。输入的字符(在类 Unix 系统上通常是 ctrl-d)永远不会返回。相反,终端设备驱动程序会注意到它并导致read() 系统调用返回读取的零字节,这表明更高级别的文件结束。 C 库再次截获此文件结束指示并使getchar() 返回EOF(通常为-1)。
    • char 在大多数 C 实现中不限于七位数字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多