Ti ringrazio per questa bella risposta particolareggiata.
Non ho capito bene: intendi che il buffer passato sia coerente col size e tuttavia più corto dello stream?
Quindi,
gestisce solo il caso "banale" - ovvero, c'è stato tutto e lo stream non è terminatocodice:nome[strlen(nome)-1] = 0;
Temo che non sia esattamente questa l'intenzione dell'estensore, colpa mia per aver tagliato la nota all'esempio (ma era solo la prima parte rilevante per il mio dubbio):
Il comando dato dopo fgets() è necessario perché tale funzione legge anche ilcarattere '\n', mettendolo alla fine della stringa. Se non si vuole terminare la stringa
con un '\n' si piazza il carattere terminatore '\0' al suo posto (ovvero una posizione
prima della fine della stringa).
E comunque questa parte non mi sembrava/sembra molto chiara: il fatto che \n sia messo alla fine della stringa non sembra reggere col fatto che \0 lo rimpiazzi una posizione prima della fine della stessa. Per il resto mi sembra che volesse dire qualcosa tipo non terminare la stringa con '...\n\0', cioè se la si vuole terminare con esattamente l'ultimo carattere di input visualizzato sullo schermo.