函数无法检测到EOF

时间:2019-04-20 08:50:03

标签: c

函数get_word应该从stdin读取单词并保存。保存白色​​字符后的下一个单词并在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 个答案:

答案 0 :(得分:1)

此循环:

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

仅在getc()返回零时(即,它读取空字符'\0'时终止)。当它返回EOF时,您将把该值(转换为char)存储在s[i]中并继续循环。

循环后EOF 的测试将永远不匹配。

您需要在循环返回EOF时结束循环。通常的成语是:

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