【发布时间】:2011-08-05 00:51:19
【问题描述】:
作为一点背景知识,我对 C 编程语言很陌生,因此一直在尝试完成 Kernighan & Ritchie 手册第二版中的一些练习。我确实意识到,通过更多地利用标准库,我可能可以更简洁地处理某些问题,但我正在努力使我的有用命令库尽可能与本书保持同步。
如果有什么不同,我将在 Windows XP 环境中使用 Tiny C 编译器 (TCC) 编译我的源代码,并在 XP 控制台 (cmd.exe) 中执行二进制文件。
问题:处理End-of-File (EOF) characters。我整理了一个小测试用例来说明这个问题。该程序似乎处理了 EOF 字符(部分)。我将尝试通过示例输入/输出来演示该问题。
#include <stdio.h>
int main()
{
int character, count;
character = 0;
character = getchar();
for (count = 0; character != EOF; ++count)
{
character = getchar();
}
printf("Count: %d", count);
return 0;
}
示例输入 1:abcd^Z[enter](其中 ^Z/CTRL+Z 代表 EOF 字符,[enter] 代表 Enter 键。)
示例输出 1:Count: 4(等待更多输入或在 ^C/^Z[enter] 上正确结束)
示例输入 2:abcd^Zefgh
示例输出 2:Count: 4(等待更多输入或在 ^C/^Z[enter] 正确结束)
正如在两个示例中所指出的,在启动 ^C/^Z[enter] 序列之前不会输出字符计数。在启动之前,程序会等待(实际上是处理)更多输入。但是,如示例 2 中所述,当程序遇到初始 ^Z 时,它会停止处理该行输入,等待更多输入或在启动 ^C/^Z[enter] 序列时返回正确的计数。
我不明白为什么程序只部分处理了 EOF 字符。在我看来,如果它截断样本 2 的结尾,它也应该完全脱离循环。任何想法为什么在识别 EOF 字符后程序不会立即打印当前计数并退出?
【问题讨论】:
-
作为更新,我确定 Tiny C 编译器确实可以识别 EOF 字符 ^Z。 ^Z(输入)和 EOF(符号常数)都被识别为值 -1。
-
另一个更新,我将另一个符号常量 EOT(传输结束)定义为 4。现在,当我针对这个常量进行测试时,通过发出 ^D(识别为值 4),一切都按计划进行。但是,如果将 EOT 定义为 -1,作为 EOF,程序会再次中断。这看起来确实很奇怪,因为 ^Z 被程序识别为值 -1。
-
您误将
^Z视为一个角色。在终端/控制台级别指定生成 EOF 的任何字符都会在到达您的应用程序之前由另一层解释。在 Windows 上,^D默认情况下并不特殊,因此您只需获取字节^D(4)。 -
@R.. 是的,我相信你是对的。在进一步思考了这个问题之后,我得出的结论是 ^Z 在单独读取时被识别为-1(可能是因为 cmd 截断了进一步的输入,导致读取长度为零)。我只是在这里猜测,但是在考虑场景 2 时这是有道理的,因为程序在等待进一步输入时只读取“abcd”。似乎 ^Z(不像 ^D 实际代表 ASCII 字符 4)只是虚无/虚无的符号表示。再次感谢您的洞察力。你肯定帮助我巩固了这个概念。
标签: c windows-xp cmd eof