In effetti la documentazione di
fgets non e' chiara. Comunque dice che ferma la lettura DOPO che legge in carattere "
a capo" quindi tale carattere e' incluso nella stringa finale. Ma le cose non sono cosi' semplici, in quanto alcuni sistemi operativi quando premi <return> inviano sia un newline (\n) che un return (\r) per cui ti puoi ritrovare DUE caratteri "estranei" prima del terminatore (lo zero).
Quello che io in genere faccio, per essere sicuro, e' di scansionare la stringa appena letta all'indietro, ossia partendo dall'ultimo carattere, e continuo a farlo in un loop finche' il carattere e' o
\n o
\r, sostituendoli con zero. Lascio a te questo semplice esercizio.
PS invece di
fgets() puoi usare
gets() che di fatto elimina il carattere di fine linea, qualunque siano, ma ha altri problemi (non puoi limitare la lunghezza della stringa) per cui viene in genere sconsigliata. Comunque se vuoi leggere tutta la linea, incluso eventuali spazi, devi usare fgets (o gets) perche' se usi
scanf() ti legge solo la prima stringa prima di un carattere separatore (spazio o TAB)
--- i due messaggi sono stati uniti ---
1) Quindi se copio carattere per carattere, il carattere di fine riga
devo aggiungerlo manualmente ?
Esatto, dopo il ciclo for che usi per copiare la stringa devi aggiungere un:
str2[strlen(str1)] = 0;
Altrimenti l'istruzione
strcmp() non sa quanto sia lunga la stringa str2, OPPURE potresti usare
strncmp()
Fun with C.
E non abbiamo neppure inziato a parlare di Unicode :)
Non per nulla i linguaggi moderni hanno un tipo speciale apposta per le stringhe, lasciando da parte queste pazzie di vettori di caratteri.