C EOF之前没有换行?

C EOF之前没有换行?,c,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

我正在解决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;
}
该程序的输出为:

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


多谢各位

循环在
getchar()
return
EOF
时结束,因此,如果
结束,则永远不会进入
else

例如:

#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++;
    }
  }
}
#包括
#包括
内部主(空){
printf(“直方图”);
尺寸长度=0;
bool running=true;
(跑步时){
开关(getchar()){
案例EOF:
运行=错误;
案例“”:
案例“\n”:
案例'\t':
案例'\r':
如果(len!=0){
printf(“\n”);
len=0;
}
打破
违约:
printf(“[]”);
len++;
}
}
}
移动测试:

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;
}

尝试
fflush(stdout)在程序的末尾。您可以在文本编辑器中打开该文件,并在最后一行添加换行符。如果len不是0,则在退出循环时再执行一步打印。如果不希望循环终止,则循环终止。将终止条件更改为您真正想要的条件。(EOF和len==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;
}