Newline,EOF和feof()未得到承认

时间:2013-08-16 16:32:19

标签: c newline eof fgetc

我有一个执行以下操作的功能:

ssize_t headache(char **lineptr, size_t *n, FILE * stream)
{
    if(lineptr != NULL)
    {
            free(*lineptr);
    }
    size_t  len     = 0,
            last    = 0;
    char *  buf     = NULL;
    int c;

    do
    { 
            last = len;
            ++len;
            buf = realloc(buf,len);
            c = fgetc(stream);
            buf[last] = (char)c;
            printf("%i\t%x\t%c\n", last, buf[last], buf[last]);
    }
    while(!feof(stream) || c != '\n');
    *n = strlen(buf);
    *lineptr = buf;
    return len;
}

头痛总是被称为头痛(& lineptr,& n,stream)

char * lineptr = NULL;
size_t n = 0;
FILE * stream;

do {} while();循环将永远不会确认换行符或EOF,这意味着它将继续在无穷大。我不明白为什么它忽略了EOF和'\ n'。有人可以告诉我,我做错了什么?

2 个答案:

答案 0 :(得分:3)

while(!feof(stream) || c != '\n');
除非两个条件都评估为false,否则

将再次循环。您希望在收到EOF\n时退出循环,因此应使用&&代替

while(!feof(stream) && c != '\n');

答案 1 :(得分:0)

您的问题是

while(!feof(stream) || c != '\n')

这是因为使用|| (或)你必须使两个条件都为假,以便停止执行。有些输入会使你的while循环永远不会结束。 this is a test inputthis is a test input\n

如果您将此作为stdin运行,则file*比较当您运行它时,键入消息并按Enter键并键入一个消息并按control-d(在终端中为EOF)

正如simonc所说,你需要&&运算符只需要其中一个条件为假而停止。