按照我的方式工作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'中即可。 –