K&R: Глава 6 - Почему функция getword () не читает EOF?

Это мой самый первый пост о переполнении стека, поэтому я надеюсь, что никому не наступлю на пятки.

Конечно, любой вклад приветствуется и приветствуется, но те, кто больше всего подходит для ответа, действительно прочитали бы книгу Язык программирования C, 2-е изд.

Я только что закончил кодировать Упражнение 6-4, но, кажется, не могу что-то понять. Почему функция getword () не читает EOF, пока я не нажму Ctrl + D (я кодирую на C в виртуальной машине Arch Linux)?

Многие из моих предыдущих упражнений из книги требуют чтения из стандартного ввода. Один из способов сделать это - использовать что-то вроде

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

На данный момент это первая программа, которую я написал с начала этой книги, которая требует, чтобы я вручную вводил EOF через Ctrl + D. Я просто не могу понять почему.

Заранее благодарен за объяснения ...

5
задан Keith Thompson 15 December 2011 в 02:43
поделиться