作为一个小背景,我对C编程语言颇为陌生,因此一直试图通过第二版的Kernighan & Ritchie手册中的一些练习。我意识到我可以通过更多地使用标准库来更加简洁地处理某些问题,但是我尽可能地尽量保持我的有用命令的剧目与本书同步。为什么我需要多个EOF(CTRL + Z)字符?
如果它有所作为,我使用Tiny C编译器(TCC)在Windows XP环境下编译源代码,并在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字符和[输入]表示输入键。)
示例输出1:Count: 4
(等待更多的输入或端部上正确^ C/^ Z [输入])
样品输入2:abcd^Zefgh
示例输出2:Count: 4
(对于更多的输入等待或端上正确^ C/^ Z [输入])
正如在这两个例子中所指出的,直到^ C/^ Z [输入]序列被启动后才会输出字符数。在开始之前,程序等待(并确实处理)更多输入。但是,如例2所述,当程序遇到最初的^ Z时,它会停止处理该输入行,等待更多输入或在启动^ C/^ Z [输入]序列时返回正确的计数。
我不明白为什么程序只是部分处理EOF字符。在我看来,如果它截断了样本2的结尾,那么它也应该完全脱离循环。任何想法为什么在识别EOF字符时,程序不会立即打印当前计数并退出?
作为一个更新,我确定Tiny C编译器似乎确认了EOF字符^ Z。^Z(输入)和EOF(符号常量)都被识别为值-1。 – bfisher 2011-04-13 22:23:13
另一个更新,我定义了另一个符号常量EOT(End-of-Transmission)为4.现在,当我测试这个常数时,通过发出一个^ D(被认为是值4),所有工作都按照计划进行。但是,如果将EOT定义为-1,则EOF将再次破坏程序。这看起来很奇怪,因为^ Z被程序识别为值-1。 – bfisher 2011-04-14 00:25:31
你错误地将'^ Z'看作一个角色。无论终端/控制台级别的哪个字符被指定为生成EOF,都会在另一个层到达您的应用程序之前进行解释。在Windows上,'^ D'默认情况下并不是特殊的,所以你只需要获得字节'^ D'(4)。 – 2011-04-15 11:27:54