按照我的方式工作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編譯該文件。
有人可以解釋,爲什麼會發生這種情況,還是隻是我的機器上發生的錯誤?
只有在沒有更多數據要刷入'stdin'時,CTRL + D纔會發送'EOF'。否則,只需將數據刷新到'stdin'中即可。 –