【发布时间】:2015-06-29 17:57:51
【问题描述】:
下面的代码是我对 K&R The C Programming Language 中练习 1-13 的回答,它要求输入单词长度的直方图。我的问题是关于EOF。如何在不完全结束程序的情况下跳出 while 循环?我使用了 Ctrl-Z,我听说它在 Windows 上是 EOF,但这会结束程序,而不是仅仅打破 while 循环。如何在 while 循环之后进入 for 循环而不结束文件?这是一个普遍的问题,不仅是我下面的代码,还有 K&R 中使用的所有代码:while ((c = getchar()) != EOF)。提前致谢! `
#include <stdio.h>
#define MAXLENGTH 20 /* Max length of a word */
#define IN 1 /* In a word */
#define OUT 0 /* Out of a word */
int main() {
int c, i, j, len = 0;
int lenWords[MAXLENGTH];
bool state = OUT;
for (i = 0; i < MAXLENGTH; ++i) {
lenWords[i] = 0;
}
c = getchar();
while (c != EOF) {
if (c != ' ' && c != '\n' && c != '\t') {
if (state == IN) {
lenWords[len - 1] += 1; /* a length 5 word is in subscript 4 */
len = 0;
}
state = OUT;
}
else {
state = IN;
}
if (state == IN) {
len += 1;
}
c = getchar();
}
/* Generating a histogram using _ and | */
for (i = 0; i < MAXLENGTH; ++i) { /* Underscores write over one another; not so efficient */
for (j = 0; j < lenWords[i]; ++j) {
putchar('_');
}
putchar('\n');
for (j = 0; j < lenWords[i]; ++j) {
putchar('_');
}
putchar('|');
printf("Length: %d, Frequency: %d", i + 1, lenWords[i]);
}
return 0;
}
【问题讨论】:
-
Ctrl-Z(Windows) 和Ctrl-D(Linux) 不会结束程序,它们会结束控制台输入(在 Windows 中,仅在newline之后)。Ctrl-C可能会结束程序,具体取决于配置。 -
使用 cygwin 可能吗? ^Z 将暂停程序,新用户可能会将其误解为已终止。 Cygwin 终端旨在让 unix 用户感到舒适,因此“^Z= EOF”之类的 Windows 终端提示不适用。
-
我尝试了您的程序(在 MacOS 下),在将
bool更改为int后,它编译并似乎可以工作。我输入了 control-D,它停止接受输入,并打印出直方图。 Control-D 是类 Unix 系统上的键盘文件结束符,包括 Linux 和 Mac OS X。在 Windows 上,当然是 control-Z,我认为有时您可能必须在键入 control- 后按 Return 键Z,什么的。 -
是的,我正在使用 cygwin。我应该知道它不会是 windows 命令。
-
@user1692570 我想知道您是否认为接受答案可能是一种选择。根据您的评论,我认为这就是您要寻找的东西。
标签: c