Esercizio in c sulle stringhe

SalvatCpo
Questo è un pezzo di una simulazione d'esame. Il programma prende una frase e memorizza le singole parole su un vettore di stringhe. Poi c'è una funzione di tipo booleano, che ha come argomento questo vettore e anche il numero di parole.
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".

#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à.

Risposte
Summerwind78
Ciao


ho provato il tuo programma senza apportare alcuna modifica e funziona perfettamente

a me il simbolo indicato nel testo compattato non compare.
Credo proprio che il problema sia quello

SalvatCpo
E' la centesima volta che mi capita che un programma funziona agli altri e a me no.
Ho provato sia il dev che altri software.
Il problema può essere windows 10?
Come posso risolvere?

Super Squirrel
- le librerie math e time non servono;
- nella funzione elaboratesto() la variabile "n" non è inizializzata, in ogni caso puoi farne a meno e utilizzare direttamente la variabile "i";
- il motivo per cui il testo "compattato" presenta dei caratteri strani all'inizio (che è anche lo stesso motivo per cui la funzione palindromo() restituisce un risultato "sbagliato") è che la stringa "a" non inizia obbligatoriamente con il carattere '\0'. La soluzione è una delle seguenti:
stringa a;
a[0] = '\0';

oppure
stringa a = "";


E' la centesima volta che mi capita che un programma funziona agli altri e a me no.

Probabilmente anche per gli altri 99 c'è una spiegazione diversa dalla compatibilità software! :roll:

In ogni caso non ha senso separare la stringa e poi "ricompattarla", basta considerare due indici: uno che parte dall'inizio e prosegue verso destra e uno che parte dalla fine e prosegue verso sinistra. Se si incontra un carattere non valido (lo spazio in questo caso) l'indice viene incrementato.

SalvatCpo
@Super Squirrel sei stato bravo a trovare l'errore, grazie mille.
Potresti dare un'occhiata qui? E' un problema che non riesco a risolvere da mesi.

viewtopic.php?f=15&t=192500

Leggi solo il mio post iniziale, il resto non serve.
Grazie in anticipo.

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