Aggiungo solo una postilla. Qui buffer sono dimensionati in modo estremamente largheggiante: in questo genere di esercizi, anything goes. Se però vogliamo davvero fare della programmazione difensiva in un contesto un po' più serio, dobbiamo invece limitare ad un valore ragionevole l'encoding (es. LINE_MAX pari a 10 caratteri, incluso '\n') e poi ragionare sul worst case: se fossero tutti simboli alfabetici, occorrerebbe il doppio di spazio nel buffer di output, quindi lo si dimensiona prudenzialmente a 2 x LINE_MAX.