【问题标题】:C input - getchar()C 输入 - getchar()
【发布时间】:2012-03-20 22:36:09
【问题描述】:

这是一个基本问题.. 但不得不问。对于这样的程序,如果用例是 123^Z,则程序不会终止,即使我在末尾放置了 EOF (Ctrl+Z)。为什么呢?只有当我在 CR 之后放置 EOF 时它才会起作用。任何答案将不胜感激。谢谢。

#include < stdio.h>

void main()
{
    int i, nc;

    nc = 0;
    i = getchar();
    while (i != EOF) {
        nc = nc + 1;
        i = getchar();
    }
    printf("Number of characters in file = %d\n", nc);
}

【问题讨论】:

  • 什么平台? ^Z 让我想到了 Windows,但如果你用你的平台标记这个问题会很好。谢谢。
  • 如果在 EOF 之后放置 CR 会发生什么?
  • 在 linux 下与^D 的行为相同。仅在换行时有效
  • 简短的回答是 Windows 就是这样工作的。但是请注意,如果您按 F6 而不是 ctrl+Z,即使它在行的中间也会生效。
  • k&R,how getchar read EOF的可能重复

标签: c windows getchar


【解决方案1】:

在 Windows 中,Ctrl-Z 快捷键只有在行首按下时才会生效。否则,操作系统会忽略它。您必须先按“enter”或“return”才能插入换行符。

在 Unix 中,Ctrl-D 快捷方式将立即刷新stdin(如下面的 cmets 所述),但不会导致 getchar() 返回 EOF,除非您位于新的空白行上;与 Windows 相同。

来自 cmets(下):

Unix 上没有“EOF 字符”。 EOF 只是一个零长度读取。它发生在普通文件的末尾,并且可以通过按在终端设置中为 EOF 设置的控制字符(通常是 ^D)在终端上强制执行。当终端缓冲区非空时,^D“不起作用”的原因是它实际上并没有在流中插入一些东西;它只会导致挂起的读取返回,但由于输入长度不为零,因此应用程序不会将其视为“EOF”。

这解决了一个好点 - 实际上没有文件包含 EOF - 并且按 Ctrl-D 不会“插入”(正如我之前所说)到 stdin 流中的任何内容。它只是刷新stdinEOF 是一个标准宏,表示标准函数已到达文件末尾的通知。

感谢@R。关于EOF的解释。

【讨论】:

  • 不完全。虽然^D 在一行内工作以刷新 STDIN,但它不会立即关闭 STDIN。
  • 我的系统(Debian,当然不是 Unix)的行为不像你描述的那样。在该行的中间键入 Ctrl+D 具有不按回车键入回车的明显效果。
  • 感谢尼克拉斯的评论。我相应地更新了我的答案。
  • Unix 上没有“EOF 字符”。 EOF 只是一个零长度读取。它发生在普通文件的末尾,并且可以通过按在终端设置中为 EOF 设置的控制字符(通常是 ^D)在终端上强制执行。当终端缓冲区非空时,^D“不起作用”的原因是它实际上并没有在流中插入一些东西;它只会导致挂起的读取返回,但由于输入长度不为零,因此应用程序不会将其视为“EOF”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多