Quote Originariamente inviata da filips Visualizza il messaggio
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?
Più corto della riga da leggere.
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):
Nah, sono abbastanza sicuro che sia come dico, è un pattern diffuso.
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.
Non capisco cosa non ti è chiaro... se vuoi accorciare la "lunghezza logica" di una stringa basta che rimpiazzi il carattere a cui vuoi farla terminare con un \0; nel caso specifico, visto che la fgets ti restituisce un \n in coda, lo rimpiazzi con un \0, in modo da farlo sparire, scorciando la stringa di un carattere.

La risposta di oregon andrebbe bene se non fosse che strtok non è né rientrante né thread-safe, per cui in linea di massima va evitata. Piuttosto, si può sfruttare la funzione (sconosciuta ai più, me compreso ) strcspn:
codice:
nome[strcspn(nome, "\n")] = 0;
(strcspn(s, reject) restituisce la lunghezza del primo segmento di s che non contiene nessuno dei caratteri di reject, che è perfetta per il nostro caso, dato che di fatto restituisce la posizione del newline o, se non è presente, del NUL finale).