[C] Parole palindrome correzione codice

floppyes
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.
#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
apatriarca
È 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.

floppyes
Ciao!

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 :-)

apatriarca
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.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.