EOF之前没有新行?

时间:2017-02-24 00:51:32

标签: c

我正在解决K& R的其中一个练习,但我遇到了一个小问题。 练习是在其输入中打印单词长度的直方图。

这是我的代码:

#include <stdio.h>
#define IN 1
#define OUT 0

int main(){
    //Histogram of the length of words
    int c, state, len, i;
    state = OUT;

    printf("Histogram\n");

    while ((c = getchar()) != EOF){
        if (c != ' ' && c != '\n' && c != '\t' && c != '\r'){
            state = IN;
            len++;
        } else if (state == IN){
            for (i = 0; i < len; i++){
                putchar('[');
                putchar(']');
            }
            len = 0;
            putchar('\n');
            state = OUT;
        }
    }

    return 0;
}

我使用的文本文件是:

Hello World! This is a text

该计划的输出是:

Histogram
[][][][][]
[][][][][][]
[][][][]
[][]
[]

可以看出,程序在打印出最后一个单词“text”的直方图之前终止。 这是因为Windows上的文本编辑器不会自动将'\ r \ n'放在最后吗?如果是这样,我该如何解决这个问题?

谢谢。

2 个答案:

答案 0 :(得分:1)

getchar()返回EOF时你的循环结束,所以你永远不会进入else if

示例:

#include <stdio.h>
#include <stdbool.h>

int main(void) {
  printf("Histogram\n");

  size_t len = 0;
  bool running = true;
  while (running) {
    switch (getchar()) {
    case EOF:
      running = false;
    case ' ':
    case '\n':
    case '\t':
    case '\r':
      if (len != 0) {
        printf("\n");
        len = 0;
      }
      break;
    default:
      printf("[]");
      len++;
    }
  }
}

答案 1 :(得分:0)

移动测试:

while (true)
{
    const int c = getchar();
    if (c != ' ' && c != '\n' && c != '\t' && c != '\r' && c != EOF)
    {
        state = IN;
        len++;
    }
    else if (state == IN)
    {
        // ...
    }

    if (c == EOF) break;
}