Fai che metti una stringa lunga (ad esempio) 100 caratteri, la prendi in input con fgets, la copi su un' area di memoria allocata dinamicamente e la ritorni.
Per esempio puoi fare così:

codice:
char* get_string(void)
{
    char buffer[100], *result;
    fgets(buffer,100,stdin);
    result=(char*)malloc( (strlen(buffer)+1)* sizeof(char));
    return result;
}
Una variante consiste nel prende in input direttamente la stringa allocata dinamicamente, ma allocando tot caratteri alla volta (ad esempio 10) e riallocandola solo quando supera le dimensioni dell' input, ma di tot caratteri alla volta pe limitare le chiamate alla realloc:

codice:
char* get_string(void)
{
    char* result=(char*)malloc(10*sizeof(char)),temp,length=0,dim=10;
    while( (temp=getchar())!=10)
    {
        length++;
        if(dim<length)
        {
            dim+=10;
            result=(char*)realloc(dim*sizeof(char));
        }
        result[length-1]=temp;
    }
    return result;
}
Poi ci sono mille varianti, e dipende sostanzialmente da:
-Quanta memoria vuoi occupare al massimo;
-Quanto vuoi che la routine sia veloce.

Scegli te l' importanza di questi fattori.

PS: Ci potrebbe essere qualche errore perché le ho scritte senza provare a compilarle.