Esercizio in c sulle stringhe
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".
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à.
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
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
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
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?
Ho provato sia il dev che altri software.
Il problema può essere windows 10?
Come posso risolvere?
- 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:
oppure
Probabilmente anche per gli altri 99 c'è una spiegazione diversa dalla compatibilità software!
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.
- 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!

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