【发布时间】:2012-02-07 14:46:29
【问题描述】:
以下代码显示出奇怪的行为。如果我按换行符给出输入,那么只有它打印直方图值,否则如果我直接输入 EOF(^Z),它会显示全零。 getchar() 函数是否存在问题,它仅在按下换行符时才接受输入。
#include <stdio.h>
#define IN 1 /* inside a word */
#define OUT 0 /* outside a word */
#define MAXLEN 50
/* count lines, words, and characters in input */
main()
{
int c, i, j, nc, state;
int wordlength[MAXLEN];
state = OUT;
nc = 0;
for (i = 0; i < MAXLEN; i++)
wordlength[i] = 0;
while ((c = getchar()) != EOF) {
if (c == ' ' || c == '\n' || c == '\t') {
if (state == IN) {
wordlength[nc-1]++;
}
state = OUT;
}
else if (state == OUT) {
//putchar('\n');
state = IN;
nc = 0;
}
if (state == IN) {
++nc;
}
}
for (j = 0; j < MAXLEN; j++)
printf("\n%d - %d",j,wordlength[j]);
for (i = 10; i >= 0; i--) {
for (j = 0; j < MAXLEN; j++)
printf(((wordlength[j] > i)?"|":" "));
printf("\n");
}
}
【问题讨论】:
-
请学习按照 C99(旧 C 标准;当前标准是 C2011)的要求编写 C,并为
main()函数提供显式返回类型。当你忽略参数列表时,我强烈推荐int main(void),当你处理命令行参数时,我强烈推荐int main(int argc, char **argv)。 -
不幸的是,标准输入通常是行缓冲的,您必须按 Enter 键才能输入任何键盘输入。就是这样。你可以让它无缓冲或让它不这样做。
-
@Jonathan 感谢您的建议。我正在关注一本书并尝试编写解决方案,这些解决方案仅使用到阅读点的信息。
-
@Jeff 你能告诉我怎么做吗?
-
我不清楚你在问什么......