функция не обнаруживает EOF - PullRequest
0 голосов
/ 20 апреля 2019

Функция get_word предназначена для чтения слова из стандартного ввода и его сохранения. Сохранение следующего слова после белого символа и возврат EOF на EOF, но я все еще в бесконечном цикле. htab_lookup_add - это некоторая функция для сохранения слова в таблицу. Также кажется, что проблема «Слишком длинное сообщение» никогда не печатается, но это не та проблема, которую я сейчас пытаюсь решить.

int get_word(char *s, int max, FILE *f){
    s = malloc(sizeof(char) * max);

    int c;
    int i = 0;
    while((c = getc(f))){
        if(i > max || isspace(c)){
            break;
        }
        s[i++] = c;
    }
    s[i] = '\0';

    if(c == EOF){
        return EOF;
    }
    return i;
}


while(get_word(word, (maxchar + 1), stdin) != EOF){
    if(strlen(word) > maxchar){
        printf("Too long!\n");
    }
    htab_lookup_add(table, word);
}

1 Ответ

1 голос
/ 20 апреля 2019

Этот цикл:

while((c = getc(f))){
    ...
}

завершится только тогда, когда getc() вернет ноль, т. Е. Когда будет прочитан нулевой символ '\0'. И когда он вернет EOF, вы сохраните это значение (преобразованное в char) в s[i] и продолжите цикл.

Тест для EOF после цикл никогда не будет совпадать.

Вам нужно завершить цикл, когда он вернет EOF. Обычная идиома:

while ((c = getc(f)) != EOF) {
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...