RISOLTO [C] stringa palindrome

Pubblicità
Infatti il carattere \n è proprio il carattere di andata a capo (CR = carriage return).. come dicevo sopra, la funzione fgets lo inserisce nella stringa.

Però, scusa, devi imparare (e sforzarti) a studiare le funzioni. Sei un po' troppo improvvisato e non puoi solo chiedere genericamente nel forum.. ti serve un po' di metodo.

Inviato dal mio Nexus 6P utilizzando Tapatalk
Non mi sono spiegato, io prima scrivo la patola ("otto") poi premo a capo. Quindi il carattere di a capo non dovrebbe essere memorizzato per ultimo ?

Mi puoi consigliare un PDF / libro per approfondire?

Inviato da Mi A2 Lite tramite App ufficiale di Tom\'s Hardware Italia Forum
 
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
Codice:
\0
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.
 
Ultima modifica:
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 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 ---

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.
Ok, grazie mille a tutti. Ora mi è più chiaro

Inviato da Mi A2 Lite tramite App ufficiale di Tom\'s Hardware Italia Forum
 
Pubblicità
Pubblicità
Indietro
Top