【问题标题】:Condition using EOF in C在 C 中使用 EOF 的条件
【发布时间】:2015-06-29 17:57:51
【问题描述】:

下面的代码是我对 K&R The C Programming Language 中练习 1-13 的回答,它要求输入单词长度的直方图。我的问题是关于EOF。如何在不完全结束程序的情况下跳出 while 循环?我使用了 Ctrl-Z,我听说它在 Windows 上是 EOF,但这会结束程序,而不是仅仅打破 while 循环。如何在 while 循环之后进入 for 循环而不结束文件?这是一个普遍的问题,不仅是我下面的代码,还有 K&R 中使用的所有代码:while ((c = getchar()) != EOF)。提前致谢! `

#include <stdio.h>

#define MAXLENGTH 20 /* Max length of a word */
#define IN 1 /* In a word */
#define OUT 0 /* Out of a word */

int main() {
  int c, i, j, len = 0;
  int lenWords[MAXLENGTH];
  bool state = OUT;

  for (i = 0; i < MAXLENGTH; ++i) {
    lenWords[i] = 0;
  }

  c = getchar();
  while (c != EOF) {
    if (c != ' ' && c != '\n' && c != '\t') {
      if (state == IN) {
        lenWords[len - 1] += 1; /* a length 5 word is in subscript 4 */
        len = 0;
      }
      state = OUT;
    }
    else {
      state = IN;
    }
    if (state == IN) {
      len += 1;
    }
    c = getchar();
  }

  /* Generating a histogram using _ and | */
  for (i = 0; i < MAXLENGTH; ++i) { /* Underscores write over one another; not so efficient */
    for (j = 0; j < lenWords[i]; ++j) {
      putchar('_');
    }
    putchar('\n');
    for (j = 0; j < lenWords[i]; ++j) {
      putchar('_');
    }
    putchar('|');
    printf("Length: %d, Frequency: %d", i + 1, lenWords[i]);
  }

  return 0;
}

【问题讨论】:

  • Ctrl-Z (Windows) 和 Ctrl-D (Linux) 不会结束程序,它们会结束控制台输入(在 Windows 中,仅在 newline 之后)。 Ctrl-C 可能会结束程序,具体取决于配置。
  • 使用 cygwin 可能吗? ^Z 将暂停程序,新用户可能会将其误解为已终止。 Cygwin 终端旨在让 unix 用户感到舒适,因此“^Z= EOF”之类的 Windows 终端提示不适用。
  • 我尝试了您的程序(在 MacOS 下),在将 bool 更改为 int 后,它编译并似乎可以工作。我输入了 control-D,它停止接受输入,并打印出直方图。 Control-D 是类 Unix 系统上的键盘文件结束符,包括 Linux 和 Mac OS X。在 Windows 上,当然是 control-Z,我认为有时您可能必须在键入 control- 后按 Return 键Z,什么的。
  • 是的,我正在使用 cygwin。我应该知道它不会是 windows 命令。
  • @user1692570 我想知道您是否认为接受答案可能是一种选择。根据您的评论,我认为这就是您要寻找的东西。

标签: c


【解决方案1】:

我认为您的问题属于另一个网络。

这里的答案:Equivalent to ^D (in bash) for cmd.exe?

没有。 *nix 上的 CtrlD 会生成一个 EOF,其中各种 shell 解释为运行exit。 Windows 上 EOF 的等效项 是 CtrlZ,但 cmd.exe 不解释这个 特别是在提示符下键入时。

【讨论】:

  • 是的!谢谢,就是这样!上帝保佑你!
  • 欢迎接受。另一方面。我建议我们将您的帖子标记为离题,说它属于超级用户网络。
【解决方案2】:

Ctrl+DEOF 发送到标准输入并停止*nix 上的读取。

看看here

【讨论】:

    【解决方案3】:

    您必须检查您使用的是 *nix 还是 windows。

    在 Windows 上,EOF 由 Ctrl+Z 表示,而在 *nix 上 EOF 由 Ctrl+D 表示

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 2020-09-26
      • 2018-02-25
      • 2010-12-22
      • 2011-05-20
      • 2016-12-22
      • 2010-11-28
      相关资源
      最近更新 更多