我正在阅读 K&R 书,想以我从未尝试过的方式测试 printf() 和 putchar() 函数。我遇到了一些意外事件,希望听听更有经验的程序员为什么会发生这种情况。
char c;
while((c = getchar()) != EOF) {
//put char(c);
printf("%d your character was.\n", c);
}
- 如何在输入流(getchar() 或 scanf() 函数)中获取 EOF(文件结尾)? getchar()/scanf() 函数无法识别的意外键可能会产生它?
- 在我的书中,它说 c 必须是整数,因为它需要存储 EOF 并且变量必须足够大以容纳 EOF 可以容纳的任何可能的字符。这对我来说没有意义,因为 EOF 是一个值为 -1 的常量整数,甚至 char 也可以存储。谁能解释一下这是什么意思?
- 当我向 putchar() 函数发送“hello”或“hello”时会发生什么?它期望获得一个整数,但如果我发送后一个字符串或字符序列,则会返回奇怪的输出,例如 EE 或 oo。
- 为什么当我使用上面编写的 printf() 函数时,我会得到两个输出?一个是我输入的,另一个是整数,在 ASCII 中是行尾。它是否会产生第二个输出,因为我按 Enter 键,它假定这是第二个字符?
谢谢。
最佳答案
在 Linux 上,您可以使用 Ctrl+d 发送
你需要一个 int,否则你无法区分 EOF 和最后一个可能的字符(0xFFFF 与 0x00FF 不同)
putchar
想要一个字符,而不是一个字符串,如果你试图给它一个字符串,它会打印字符串地址的一部分你只会得到一个输出:你输入的字符的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/