C: printf() 和 putchar() 问题

标签 c input printf user-input putchar

我正在阅读 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 键,它假定这是第二个字符?

谢谢。

最佳答案

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

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

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

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

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

您需要一个 int,因为 getchar 既可以返回值为 -1 (0x00FF) 的字符,也可以返回值为 -1 (0xFFFF) 的整数,它们的含义不同:值为 -1 的字符是有效字符(例如,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");
    }
}

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

我希望这能让它更清楚一些。

关于C: printf() 和 putchar() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17272977/

相关文章:

javascript - 如何在链接点击时为不同的输入字段提供不同的值

java - 在 Java 中使用 do-while 循环检查用户的输入

c - 这里的输出应该是什么?

c - GNU/Linux 替代 Turbo C 函数 `clrscr` 和 `cprintf`

c - 如何避免 realloc 溢出?

java - 尝试获取数据时出现数字格式异常

c++ - Linux 中的 sprintf uint64_t

c - socket如何发送数据?

c++ - CUDA cudaMalloc 在运行具有巨大静态数组的内核后失败

c - 我如何让 printf 在 w32 上使用 'nan'?