2016-03-15 82 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

相關問題