Esercizio in c sulle stringhe

Messaggioda SalvatCpo » 18/09/2018, 07:20

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

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.

Immagine

Grazie in anticipo a chi mi aiuterà.
SalvatCpo
Average Member
Average Member
 
Messaggio: 168 di 726
Iscritto il: 30/12/2017, 17:55

Re: Esercizio in c sulle stringhe

Messaggioda Summerwind78 » 18/09/2018, 09:35

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
Summerwind78
Advanced Member
Advanced Member
 
Messaggio: 1466 di 2976
Iscritto il: 29/01/2011, 14:06
Località: Italia

Re: Esercizio in c sulle stringhe

Messaggioda SalvatCpo » 18/09/2018, 11:14

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?
SalvatCpo
Average Member
Average Member
 
Messaggio: 169 di 726
Iscritto il: 30/12/2017, 17:55

Re: Esercizio in c sulle stringhe

Messaggioda Super Squirrel » 18/09/2018, 13:17

- 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:
Codice:
stringa a;
a[0] = '\0';

oppure
Codice:
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.
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 289 di 1486
Iscritto il: 16/05/2013, 22:05

Re: Esercizio in c sulle stringhe

Messaggioda SalvatCpo » 23/09/2018, 10:06

@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.
SalvatCpo
Average Member
Average Member
 
Messaggio: 170 di 726
Iscritto il: 30/12/2017, 17:55


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite