[C] Parole palindrome correzione codice
Ciao a tutti!
Devo svolgere il sequente esercizio:
Trova le parole palindrome in un gruppo di parola acquisite da tastiera
Io ho scritto tutto quanto il codice e sembra funzionare anche bene, l'unico problema riguarda il caso in cui la parola palindroma si trova in fondo ad una frase.
Per determinare se una parola è palindroma o meno, ho creato un'apposita funzione, che basandosi sulla lunghezza della singola parola determina, con un ciclo for, se le lettere corrispondono. Nel caso in cui le lettere corrispondano allora mi ritorna il valore 1, altrimenti il valore 0.
Per acquisire una frase ho utilizzato la funzione fgets ed un vettore che contiene tutto quanto il testo. Dopo aver acquisito il testo utilizzo la funzione strtok per separare ogni singola parola della frase. La parola viene quindi passata alla funzione che controlla se è palindroma o meno. Nel caso in cui lo fosse allora viene stampata.
Ho un problema però con l'ultima parola della frase, che contendo anche il carattere di fine stringa '\0' non viene interpretata correttamente e quindi non risulta mai palindroma.
Avete qualche suggerimento in merito? Mi basterebbe riuscire ad aggiungere più parti da escludere all'interno della strtok, non solo lo spazio ma anche il carattere di fine stringa.
Grazie
Buona serata
Ciaoo
Devo svolgere il sequente esercizio:
Trova le parole palindrome in un gruppo di parola acquisite da tastiera
Io ho scritto tutto quanto il codice e sembra funzionare anche bene, l'unico problema riguarda il caso in cui la parola palindroma si trova in fondo ad una frase.
#include <stdio.h> #include <string.h> #define DIM 50 /* * Nome: palindroma * Scopo: Determina se una parola e' palindroma * Input: char *parola: la parola da verificare * Output: 1 se la parola e' palindroma; 0 altrimenti */ int palindroma (char *parola) { int i, j; for (i = 0, j = strlen(parola) - 1; i < strlen(parola)/2 ; i++, j--) if (parola[i] != parola[j]) return 0; return 1; } /* * Nome: acquisisci * Scopo: Acquisisce parole da tastiera */ void acquisisci (char vett[]) { fgets(vett, DIM, stdin); } /* * Nome: main * Scopo: Trova le parole palindrome in un gruppo di parola acquisite da tastiera * Input: - * Output: 0 se il programma termina correttamente */ int main() { char frase[DIM]; char *token; int n; printf("Inserisci una frase:\n"); acquisisci (frase); printf("\nParole palindrome: \n"); token = strtok(frase," "); while (token != NULL) { n=palindroma(token); if (n==1) printf("%s\n", token); token = strtok(NULL," "); } return 0; }
Per determinare se una parola è palindroma o meno, ho creato un'apposita funzione, che basandosi sulla lunghezza della singola parola determina, con un ciclo for, se le lettere corrispondono. Nel caso in cui le lettere corrispondano allora mi ritorna il valore 1, altrimenti il valore 0.
Per acquisire una frase ho utilizzato la funzione fgets ed un vettore che contiene tutto quanto il testo. Dopo aver acquisito il testo utilizzo la funzione strtok per separare ogni singola parola della frase. La parola viene quindi passata alla funzione che controlla se è palindroma o meno. Nel caso in cui lo fosse allora viene stampata.
Ho un problema però con l'ultima parola della frase, che contendo anche il carattere di fine stringa '\0' non viene interpretata correttamente e quindi non risulta mai palindroma.
Avete qualche suggerimento in merito? Mi basterebbe riuscire ad aggiungere più parti da escludere all'interno della strtok, non solo lo spazio ma anche il carattere di fine stringa.
Grazie
Buona serata
Ciaoo

Risposte
È sufficiente eliminare il carattere di a capo dalla stringa letta da fgets. Usando per esempio strchr per ottenerne la posizione e poi sostituendo il carattere con il terminatore della stringa.
Ciao!
Ho quasi risolto utilizzando la funzione strlen.
Ho aggiunto all'interno della funzione acquisisci questa riga:
Così sostituisco l'ultimo carattere con uno spazio che servirà poi alla strtok per elaborare la singola parola. Adesso però ho notato che non funziona nel caso termino la frase con un punto di domanda o altri segni. Ora provo a tua soluzione
Grazie
Ciaoo
Ho quasi risolto utilizzando la funzione strlen.
#include <stdio.h> #include <string.h> #define DIM 500 /* * Nome: palindroma * Scopo: Determina se una parola e' palindroma * Input: char *parola: la parola da verificare * Output: 1 se la parola e' palindroma; 0 altrimenti */ int palindroma (char *parola) { int i, j; for (i = 0, j = strlen(parola) - 1; i < strlen(parola)/2 ; i++, j--) if (parola[i] != parola[j]) return 0; return 1; } /* * Nome: acquisisci * Scopo: Acquisisce parole da tastiera */ void acquisisci (char vett[]) { fgets(vett, DIM, stdin); vett[strlen(vett)-1]=' '; } /* * Nome: main * Scopo: Trova le parole palindrome in un gruppo di parola acquisite da tastiera * Input: - * Output: 0 se il programma termina correttamente */ int main() { char frase[DIM]; char *token; int n; printf("Inserisci una frase:\n"); acquisisci (frase); printf("\nParole palindrome: \n"); token = strtok(frase," "); while (token != NULL) { n=palindroma(token); if (n==1) printf("%s\n", token); token = strtok(NULL," "); } return 0; }
Ho aggiunto all'interno della funzione acquisisci questa riga:
vett[strlen(vett)-1]=' ';
Così sostituisco l'ultimo carattere con uno spazio che servirà poi alla strtok per elaborare la singola parola. Adesso però ho notato che non funziona nel caso termino la frase con un punto di domanda o altri segni. Ora provo a tua soluzione
Grazie
Ciaoo

Non ho guardato il tuo codice, ma la ragione per cui non funziona è probabilmente il criterio che utilizzi per estrarre le parole. Se le parole sono per te sequenze di simboli separati da spazi, è ovvio che simboli come ? vengono inclusi nella parola. Se invece tu considerassi come parole sottostringhe formate solo da caratteri alfabetici il risultato sarebbe diverso.