Il punto è che devi aumentare ad ogni iterazione la quantità di memoria allocata; ecco una mia soluzione (che evita la getchar in favore della fgets):
codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * GetLine(FILE * File);
int main(void)
{
char * stringa;
stringa = GetLine(stdin);
printf("Hai digitato: %s\n",stringa);
free(stringa);
return 0;
}
char * GetLine(FILE * File)
{
const size_t blockSize=128;
size_t actualSize = blockSize;
char * ret = NULL;
for(;;)
{
ret = realloc(ret, actualSize);
fgets(ret+actualSize-blockSize, blockSize+1, File);
if(ret[strlen(ret)-1]=='\n')
break;
actualSize+=blockSize;
}
return ret;
}
.