【发布时间】:2015-03-29 04:23:23
【问题描述】:
我的问题是关于如何在输入中间解释 EOF,这是一个示例:
int main() {
int a, b;
printf("enter something >\n");
scanf("%d", &a);
while((b = getchar()) != EOF) {
printf("%i\n", b);
}
return b;
}
我运行程序并输入:
1hello^Z(control+z)abc
输出是:
104 (ascii number for h)
101 (for e)
108 (l)
108 (l)
111 (o)
26 (what is this?)
scanf 读取数字 1,剩余的留在缓冲区中,getchar() 获取所有这些直到 ^Z,这是预期的行为,因为控件 z 关闭标准输入。 但是 26 是从哪里来的?如果 getchar() 读取的最后一件事是 EOF,为什么 -1 不是最后一个值?还有为什么这个程序在读取^Z时不退出循环,为什么我需要用控件z再调用一次EOF来终止循环? 26 是 SUB 的 ascii,我不知道该怎么做。
谢谢。
【问题讨论】:
-
Ctrl-Z 是 ASCII 26.
-
我认为控件 Z 已自动转换为 EOF,其具有负值,通常为 -1
-
EOF 将被报告为 -1,但这并不是真正的转换。 DOS/Windows 终端有一个讨厌的习惯,即实际上首先在输入中包含 Ctrl-Z。有人可能会过来纠正我的细节,但基本上就是这样。
-
你使用的是什么操作系统?
-
我有点惊讶您在输入中看到 ^Z。在 Unix(Mac、Linux)上,对应的字符通常是 ^D(control-D 而不是 control-Z)。如果您在一行上键入一些数据,然后 ^D,则发送数据。这是一个非零字节数,因此读取成功(尽管没有换行符)并继续。如果您键入更多数据,则将在再次键入 ^D 或按下换行符(回车)时读取并返回到应用程序。如果连续两次键入 ^D,则第二次表示可用的字节数为零,这就是 EOF。或者它是 EOF,您在行首键入 ^D。