Per leggere una riga di lunghezza "arbitraria" da uno stream si può fare una cosa molto "pulita" di questo tipo:

codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *read_line (FILE *f)
{
    int   block = 256;
    int   capacity = 0, len = 0;
    char *buf = NULL, *p;

    do {
        capacity += block;

        p = (char*) realloc (buf, capacity);

        if (p == NULL)
        {
            free (buf);
            return NULL;
        }

        buf = p;

        fgets (&buf[len], capacity-len, f);

        if ((p = strchr (&buf[len], '\n')) != NULL)
            *p = '\0';

        len += (int) strlen (&buf[len]);
    } while (p == NULL);

    p = (char*) realloc (buf, len+1);

    if (p != NULL)
        buf = p;

    return buf;
}