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;
}