尝试计算C中的单词时EOF不终止

时间:2018-12-04 15:49:49

标签: c eof

我正在阅读K&R,其中一个代码对单词进行计数。我决定尝试制作自己的代码版本,但是使用我当前的代码,EOF(就像我在Linux上一样Ctrl+D)无法正常工作。

#include <stdio.h>

int main(void) {
  int c, wc = 0;

  while((c = getchar()) != EOF) {
    while(c != ' ' && c != '\t' && c != '\n') {
      wc++;
    }
  }

  printf("%d", wc);

  return 0;
}

4 个答案:

答案 0 :(得分:2)

以下示例更接近于计算个单词

#include <stdio.h>

int main(void) {
  int c, wc = 0;
  int sep = 1;
  while((c = getchar()) != EOF) {
    if (c != ' ' && c != '\t' && c != '\n') {
      if ( sep ){
        wc++;
        sep = 0;
      }
    }
    else
      sep = 1;
  }

  printf("%d", wc);

  return 0;
}

答案 1 :(得分:1)

while((c = getchar()) != EOF) {
    while(c != ' ' && c != '\t' && c != '\n') {
      wc++;
    }
  }

第一次按下一个键时,内部while循环会触发,并且永远不会退出,除非第一个键是该条件中的一个。

因此,如果您按“ A”,则内部while循环将永远持续下去。

您需要将while替换为if。并修改条件,使wc仅在遇到getchar()或其他指定字符时才会增加,而.tooltip将被执行以获取下一个字符。

答案 2 :(得分:0)

我不得不在内部getchar()循环中添加while

#include <stdio.h>

int main(void) {
  int c, wc = 0;

  while((c = getchar()) != EOF) {
    while((c = getchar()) != ' ' && c != '\t' && c != '\n');
    wc++;
  }

  printf("%d\n", wc);

  return 0;
}

答案 3 :(得分:-1)

我知道我在作弊,但是此示例显示了更高级别的功能如何使程序更清晰。 scanf的{​​{1}}转换为我们进行了分词。该示例使用%s赋值抑制字符,这消除了为我们实际上不想知道的任意长单词提供空间的需要。

*

如果不得不自己动手,我会写子例程。看看#include <stdio.h> int wordcount = 0; int main(void) { while(scanf("%*s") != EOF) { wordcount++; } printf("%d\n", wordcount); return 0; } 看起来有多干净!

main