Puoi usare un puntatore a puntatore o una lista.
Nel primo caso ad ogni cliclo aumenti la dimensione del puntatore a puntatore di uno e allochi la memoria necessaria per la stringa.
Nel secondo caso aggiungi semplicemente un nodo.
Per prendere solo n caratteri fai una funzione che legge solo n caratteri dallo stdin.

EDIT: ho letto che non puoi utilizzare realloc, quindi ti conviene utilizzare una lista.