Questa funzione che ho scritto dovrebbe determinare se la frase inserita (trascurando gli spazi) era palindroma o no.
Però noto che, anche inserendo frasi palindrome, come "i topi non avevano nipoti", la booleana mi restituisce "falso".
- Codice:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<ctype.h>
#include<time.h>
#define DIMMAX 30
//dichiarazione dei tipi
typedef char stringa[DIMMAX];
typedef stringa testo[DIMMAX];
typedef enum booleano {falso, vero} booleano;
//prototipi delle funzioni
int elaboratesto (testo t);
void stampatesto (testo t, int n);
booleano palindromo (testo t, int n);
//main
int main() {
testo a;
int n=elaboratesto(a);
printf ("numero di parole: %d\n", n);
stampatesto (a, n);
printf ("palindromo? (0 no, 1 si): %d\n", palindromo(a,n));
system ("PAUSE");
return 0;
}
//fine main
//funzioni
// in "elaboratesto" t è automaticamente passato per riferimento perchè è un vettore
int elaboratesto (testo t){
stringa s;
int n;
int i=0;
printf ("inserisci il testo: ");
gets (s);
char *k;
k=strtok(s, " ");
while (k!=NULL)
{
strcpy (t[i], k);
k=strtok(NULL, " ");
n++;
i++;
}
return n;
}
void stampatesto (testo t, int n)
{
int i=0;
printf ("elenco parole:\n");
while (i<n)
{
printf ("%s\n", t[i]);
i++;
}
}
booleano palindromo (testo t, int n)
{
stringa a;
booleano b=vero;
int i=0;
int l=0;
while (i<n)
{
strcat (a, t[i]);
i++;
}
printf ("testo compattato: %s\n", a);
i=0;
//uniformo il testo con sole lettere minuscole
while (a[i]!='\0')
{
if (isupper(a[i]) )
{
a[i]=tolower(a[i]);
}
i++;
}
l=strlen(a);
printf ("lunghezza: %d\n", l);
i=0;
while (i<l/2)
{
if (a[i]!=a[l-i-1])
{
b=falso;
}
i++;
}
return b;
}
Dall'esecuzione è possibile notare un'anomalia, che è la probabile causa del malfunzionamento della booleana "palindromo".
Infatti si vede che la lunghezza della frase compattata (senza spazi, ottenuta accodando le stringhe del vettore testo) è sbagliata perché forse tiene conto di quel simboletto che inspiegabilmente compare all'inizio.
Grazie in anticipo a chi mi aiuterà.