c - 为什么我需要多个 EOF (CTRL+Z) 字符?

标签 c windows-xp cmd eof

作为一个小背景,我对 C 编程语言还很陌生,因此一直在尝试完成 Kernighan & Ritchie 手册第二版中的一些练习。我确实意识到,通过更多地使用标准库,我可能可以更简洁地处理某些问题,但我正在努力使我的有用命令库尽可能与本书保持同步。

如果有所不同,我正在使用 Tiny C 编译器 (TCC) 在 Windows XP 环境中编译我的源代码,并在 XP 控制台 (cmd.exe) 中执行二进制文件。

问题:处理文件结束 (EOF) 字符。我整理了一个小测试用例来说明这个问题。该程序似乎(部分)处理了 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] 代表回车键。)

示例输出 1:计数:4(等待更多输入或在 ^C/^Z[enter] 上正确结束)

示例输入 2:abcd^Zefgh

示例输出 2:计数:4(等待更多输入或在 ^C/^Z[enter] 上正确结束)

正如在这两个示例中所指出的,字符计数在启动 ^C/^Z[enter] 序列之前不会输出。在启动之前,程序会等待(实际上是处理)更多输入。但是,如示例 2 中所述,当程序遇到初始 ^Z 时,它会停止处理该行输入,等待更多输入或在启动 ^C/^Z[enter] 序列时返回正确的计数。

我不明白为什么程序只部分处理 EOF 字符。在我看来,如果它截断样本 2 的末尾,它也应该完全跳出循环。为什么程序在识别到 EOF 字符后不会立即打印当前计数并退出?有什么想法吗?

最佳答案

这个答案是 unix-ish,但我认为类似的现象正在 Windows 上发生。 EOF 的基本形式是零长度的read。在交互式输入设备(终端)上,有一种在输入流中包含 EOF 的特殊机制,但如果已经有要读取的输入,它将与该输入一起被消耗(导致非零长度 read ),因此应用程序永远不会注意到。只有当 EOF 发生时没有预先缓冲输入,应用程序才能注意到它并采取行动。

如果您可以访问 Linux(或其他 *nix)系统,请编写类似的测试程序并在 strace 下运行它。观察发生的底层 read 调用,就会明白造成这种不直观行为的原因。

关于c - 为什么我需要多个 EOF (CTRL+Z) 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5655112/

相关文章:

c - 写套接字导致 C 中的 "program exited with code 141"

c++ - 链接器语法 : Linker does not use all of the linkers's flag during the linking

css - 如何在没有 ipad 的情况下测试 ipad 网站,无论是纵向还是横向?

javascript - Wscript.shell.run 和 Wscript.shell.exec 不显示相同的输出

C 函数原型(prototype)

c - 如何在 C 中使用零长度数组

c++ - 基于windows版本的c++条件编译

Python:OpenCV 无法在 Windows xp 上加载

cmd - 静默命令 net stop

c - 与 C scanf() 函数等效的 cmd 脚本是什么?