1

我有一个执行以下操作的函数:

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'。有人可以告诉我我做错了什么吗?

4

2 回答 2

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

除非两个条件都为假,否则将再次循环。您想在收到时退出循环,EOF或者\n应该&&使用

while(!feof(stream) && c != '\n');
于 2013-08-16T16:34:47.750 回答
0

你的问题是

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

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

如果您将其作为标准输入运行file*,以比较当您运行它时会发生什么,您输入一条消息并按 Enter,然后您输入一条消息并按 control-d(这是终端中的 EOF)

正如 simonc 所说,您需要 && 运算符,它只需要条件之一为假即可停止。

于 2013-08-16T16:49:27.923 回答