Che ci sia "sporcizia" dopo i dati e' corretto (dato che non hai inizializzato lo spazio usato dalle stringhe).

Quello che deve sempre essere e' che, se indichi 1, devono esserci 40 byte ...

Se vuoi, puoi scrivere

memset(&lib, 0, sizeof(libro));

prima di inserire i dati.