这是我关于Stack Overflow的第一篇文章,所以我希望我不要踩到任何人的脚趾.
当然,所有的输入都是受欢迎和赞赏的,但那些最适合回答的人实际上会阅读C编程语言第二版.
我刚刚完成了练习6-4的编码,但我似乎无法解决问题.为什么getword()函数在按Ctrl + D(我在Arch Linux VM中使用C代码)之前不会读取EOF?
我之前的许多练习都需要从stdin中读取.我会做的一种方式是通过类似的东西
while ((c = getchar()) != EOF) {...}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我永远不必按Ctrl + D. 我在输入中输入,按Enter键,stdin缓冲区被刷新,并自动检测到EOF.getword()函数也依赖于它的基础上的getchar(),为什么它会挂起我的程序?
从main()调用getword()函数:
while (getword(word, MAX_WORD) != EOF) {
if (isalpha(word[0])) {
root = addtree(root, word);
}
}
Run Code Online (Sandbox Code Playgroud)
getword()函数本身:
int getword(char *word, int lim) {
char *w = word;
int c;
while (isspace(c = getch())) {
}
if (c != EOF) {
*w++ = c;
}
// This point is reached
if (!isalpha(c)) {
// This point is never reached before Ctrl+D
*w = '\0';
return c;
}
for ( ; --lim > 0; w++) {
if (!isalnum(*w = getch())) {
ungetch(*w);
break;
}
}
*w = '\0';
return word[0];
}
Run Code Online (Sandbox Code Playgroud)
我发表评论以表明我确定EOF未被阅读的地方.
getch()和ungetch()函数与第4章波兰表示法计算器中使用的函数相同(并且该程序能够自动读取EOF - 按Enter键):
#define BUF_SIZE 100
char buf[BUF_SIZE];
int bufp = 0;
int getch(void) {
return (bufp > 0) ? buf[--bufp] : getchar();
}
void ungetch(int c) {
if (bufp >= BUF_SIZE) {
printf("ungetch: too many characters\n");
}
else {
buf[bufp++] = c;
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是我从本书开头以来编写的第一个程序,它要求我通过Ctrl + D手动输入EOF.我似乎无法弄明白为什么.
提前多多赞赏解释......
必须键入 Ctrl+D 才能获取 EOF 是类 Unix 系统的正常行为。
对于您的代码片段:
while ((c = getchar()) != EOF) {...}
Run Code Online (Sandbox Code Playgroud)
按Enter绝对不应该终止循环(除非你的 tty 设置严重混乱)。
尝试编译并运行该程序:
#include <stdio.h>
int main( void )
{
int c;
while ((c = getchar()) != EOF) {
putchar(c);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它应该打印您键入的所有内容,并且仅当您在行首键入 control-D 时(或者当您使用 control-C 终止它时),它才应终止。