在C中使用EOF的条件

时间:2015-06-29 17:57:51

标签: c

以下代码是我在K& R C编程语言中练习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;
}

3 个答案:

答案 0 :(得分:4)

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

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

  

没有。 * nix上的 Ctrl D 生成一个EOF,其中各种各样   shell解释为正在运行exit。相当于Windows上的EOF   是 Ctrl Z ,但cmd.exe不解释这个   特别是在提示符下输入时。

答案 1 :(得分:1)

Ctrl + D EOF发送到标准输入并停止读取* nix。

看看here

答案 2 :(得分:0)

您必须检查是否使用* nix或windows。

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