Puoi utilizzare le funzioni di I/O di basso livello, cioè la read()
Il prototipo è :
ssize_t read(int fd,void* buf,size_t count)
fd è il descrittore di un canale da cui leggere, può essere lo standard input, o un socket, o un file o qualsiasi canale di input.
buf è la variabile in cui vuoi che siano memorizzati i dati letti; nel tuo caso un char*
count è il numero massimo di byte che vuoi che siano letti,ma se vengono letti meno byte di quanto richiesto non c'è errore.
Ritorna il numero effettivo di byte letti, zero se non ha letto neinte, -1 in caso di errore.
Cosa importante è che questa funzione non mette il /0 alla fine della stringa, quindi dovrai aggiungerlo tu manualmente.
Ad esempio per leggere dallo standard input dovrai fare :
char *buf;
../*codice tuo*/
bytes=read(STDIN_FILENO,buf,512);
buf[bytes-1]='\0';
ciao ciao