4

我正在阅读 K&R 的书,想以我从未尝试过的方式测试 printf() 和 putchar() 函数。我遇到了几个意外事件,并想听听更有经验的程序员为什么会发生这种情况。

char c;
while((c = getchar()) != EOF) {
//put char(c);
    printf("%d your character was.\n", c);
}
  1. 如何在输入流(getchar() 或 scanf() 函数)中获得 EOF(文件结尾)?getchar()/scanf() 函数无法识别的意外键会产生它吗?
  2. 在我的书中,它说 c 必须是一个整数,因为它需要存储 EOF 并且变量必须足够大以容纳 EOF 可以容纳的任何可能的字符。这对我来说没有意义,因为 EOF 是一个值为 -1 的常量整数,甚至 char 也可以存储。谁能澄清这是什么意思?
  3. 当我向 putchar() 函数发送“hello”或“hello”时会发生什么?它期望得到一个整数,但如果我发送后一个字符串或字符序列,则返回奇怪的输出,例如EEoo 。
  4. 为什么当我使用上面编写的 printf() 函数时,我得到两个输出?一个是我输入的,另一个是整数,在 ASCII 中是行尾。它是否会产生第二个输出,因为我按 Enter 键,它假定它是第二个字符?

谢谢。

4

2 回答 2

4
  1. 在 Linux 上,您可以使用 Ctrl+d 发送它

  2. 你需要一个 int,否则你无法区分 EOF 和最后一个可能的字符(0xFFFF 与 0x00FF 不同)

  3. putchar想要一个字符,而不是字符串,如果你想给它一个字符串,它会打印字符串地址的一部分

  4. 您只会得到一个输出:您输入的字符的 ascii 值,另一个“输入”是您在终端中输入的内容

编辑-有关 2 的更多详细信息

您需要一个 int,因为 getchar 可以返回值 -1 (0x00FF) 的字符和值 -1 (0xFFFF) 的整数,它们的含义不同:值 -1 的字符是有效字符 (例如,它是 ÿ in latin-1) 而值 -1 的整数在这种情况下是 EOF。

这是一个显示差异的简单程序:

#include <stdio.h>

int main(int argc, char ** argv) {
    {
        char c = 0xFF; /* this is a valid char */
        if (c == EOF) printf("wrong end of file detection\n");
    }
    {
        int c = 0xFF; /* this is a valid char */
        if (c == EOF) printf("wrong end of file detection\n");
    }
}

第一个测试成功,因为 0xFF == -1 用于 char,而第二个测试失败,因为 0x00FF != -1 用于 int。

我希望这让它更清楚一点。

于 2013-06-24T10:20:15.907 回答
0
  1. 您必须关闭输入流才能获得 EOF。通常在 UNIX 中使用 CTRL-D,但看 tty config (stty -a)
  2. 已经回答
  3. 相同的
  4. 您的 tty 默认会回显您键入的内容。如果您不想要这个,请将其设置为 noecho 模式 (stty -echo)。小心一些贝壳再次将其设置为回声。尝试使用 sh。您必须知道 taht tty 还会缓冲您的输入,直到 RETURN 是类型(如果需要,请参阅原始模式的 stty 手册)。
于 2013-06-24T13:24:17.870 回答