2016-03-15 80 views
1

按照我的方式工作K & R我偶然发现了这种意外的行为。考虑以下代码:带EOF的getchar()不像预期的那样运行

#include <stdio.h> 

#define MAXWLEN   10 /* maximum word length  */ 
#define MAXHISTWIDTH 10 /* maximum histogram width */ 
#define IN    1 /* inside a word   */ 
#define OUT    0 /* outside a word   */ 

int main() 
{ 
    int c, i, state; 
    int wlen[MAXWLEN]; 

    for (i = 0; i < MAXWLEN; ++i) 
     wlen[i] = 0; 

    i = 0;     /* length of currend word */ 
    state = OUT;   /* start outside of words */ 
    while ((c = getchar()) != EOF) 
    { 
     if (c == ' ' || c == '\t' || c == '\n') 
     { 
      state = OUT; 
      if (i > 0 && i < MAXWLEN) 
       ++wlen[i]; 
      i = 0; 
     } 
     else if (state == OUT) /* beginning of word */ 
     { 
      state = IN; 
      i = 1; 
     } 
     else     /* in word */ 
      ++i; 
    } 
    ++wlen[i]; 

    printf("\nwordlen\toccurences\n"); 
    for (i = 1; i < MAXWLEN; ++i) 
    { 
     printf("%6d:\t", i); 
     if (wlen[i] > MAXHISTWIDTH) 
      wlen[i] = MAXHISTWIDTH; 
     for (int j = 0; j < wlen[i]; ++j) 
      printf("#"); 
     printf("\n"); 
    } 
} 

这将计算给定输入中所有单词的长度并打印结果的直方图。结果如预期。

但是如果我输入的最后一个字符不是换行命令(回车),我必须按CTRL-D两次。我用zhs运行我的程序,用cc编译该文件。

有人可以解释,为什么会发生这种情况,还是只是我的机器上发生的错误?

+0

只有在没有更多数据要刷入'stdin'时,CTRL + D才会发送'EOF'。否则,只需将数据刷新到'stdin'中即可。 –

回答

3

这不是你的程序的行为,而是终端模拟器。

终端仿真程序通常会逐行缓冲输入并将输入发送到批量编程。他们中的大多数人通常会忽略Ctrl-D,如果在行的中间被按下,并且只有按两下才能检测到。也许他们把它当作信号来中断缓冲,不确定它是否会被缓冲。

+0

感谢您的帮助!这解释了它。 – tim

+0

它不是终端模拟器,它是操作系统的终端驱动程序。 – Barmar

相关问题