繁体   English   中英

K&R:第6章-为什么getword()函数不读取EOF?

[英]K&R: Chapter 6 - Why getword() function does not read EOF?

这是我关于Stack Overflow的第一篇文章,所以我希望我不要踩任何人的脚趾。

当然,所有输入都是值得欢迎和赞赏的,但是最适合回答的输入实际上应该已经读过《 C编程语言》第二版。

我刚刚完成了练习6-4的编码,但似乎无法弄清楚。 为什么直到我按Ctrl + D(我在Arch Linux VM中用C语言编写代码)时,getword()函数才会读取EOF?

我以前在本书中进行的许多练习都需要从stdin中阅读。 我要做的一种方法是通过类似

while ((c = getchar()) != EOF) {...}

在这种情况下,我不必按Ctrl + D。 我在输入中输入内容,然后按Enter键,标准输入缓冲区被清空,并自动检测到EOF。 getword()函数在其基础上也依赖于getchar(),那么为什么它会挂起我的程序?

getword()函数从main()调用:

while (getword(word, MAX_WORD) != EOF) {
    if (isalpha(word[0])) {
        root = addtree(root, word);
    }
}

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];
}

我发表评论以表明我确定未读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;
    }
}

到目前为止,这是自本书开始以来我编写的第一个程序,它要求我通过Ctrl + D手动输入EOF。 我似乎无法弄清楚为什么。

提前非常感谢您的解释...

对于类似Unix的系统,必须键入Ctrl + D才能获得EOF。

对于您的代码段:

while ((c = getchar()) != EOF) {...}

按下Enter键绝对不应该终止循环(除非您的tty设置被严重弄乱了)。

尝试编译并运行此程序:

#include <stdio.h>
int main( void )
{
    int c;
    while ((c = getchar()) != EOF) {
        putchar(c);
    }
    return 0;
}

它应该打印您键入的所有内容,并且仅当您在一行的开头键入control-D时(或使用control-C杀死它时),它才应终止。

仅当您在输入中键入标点符号-或阅读EOF时,才可以达到“未达到”点。 如果键入字母或空格,则将忽略该字母。

当输入来自终端(标准输入)时,直到输入换行符或敲击另一个Control-D之后,直到您键入Control-D (或stty -a输出中指定的任何值),才会检测到EOF。所以连续两次)。 该代码读取换行符,因为换行符'\\n'满足isspace()

与以前的程序相比,我感到困惑的根源是,以前的程序的效果总是打印在while循环的stdout上,因此我总是立即看到结果而无需输入EOF。 为此,直到while循环结束后才打印树,因此需要EOF遇到。 我没有意识到这一点,这就是为什么我要疯了。

再次感谢您将我摆平!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM