DOMANDA Funzione palindroma in C

Pubblicità

Witchenza

Nuovo Utente
Messaggi
13
Reazioni
3
Punteggio
23
Salve a tutti.

Ho fatto questo semplice programma con una funzione che mi dice se la parola immessa dall'utente è palindroma o meno.
C'è un problema: se immetto la parola "Anna" mi dice che è palindroma (e fin qui, tutto nella norma); ma se immetto una qualsiasi parola NON palindroma, mi dice comunque che lo è.
Allego qui il codice e spero voi possiate aiutarmi a notare e correggere il mio errore.

C:
#include <stdio.h>
#include <stdlib.h>

#define DIM 100

void palindroma(char str[]){
    
    int i, j, count;
    
    // calcolo la lunghezza della stringa
    
    for(i=0; str[i] != NULL; i++){
        count++;
        
    }
        printf("La parola contiene %d caratteri.\n", count);
    
    // fare funzione controllo palindroma
    // divido a metà la stringa, inizializzo i=0 così parte da sx verso dx
    // e inizializzo j=count-1 così parte da dx verso sx
    // infine controllo se le due mini-stringhe sono uguali o meno
    
   for(i=0, j=count-1; i<count/2; i++, j--){
      
        if(str[i]==str[j]){
             printf("La stringa è palindroma.\n");
        } else {
            printf("La stringa NON è palindroma.\n");
        }
   }
  
}

int main(){
    
    char s[DIM];
    
    printf("Inserisci una parola: ");
    scanf("%s", &s[DIM]);
    
    palindroma(s);

    return 0;
}
 
suppongo che count indichi la lunghezza della stringa: non è inizializzato a zero e devi farlo per forza visto che conti i caratteri di una stringa con un ciclo for;
a tal proposito ti faccio presente che la funzione strlen ti darebbe lo stesso risultato, ossia
count = strlen(str); // ritorna la lunghezza della stringa escluso il carattere di terminazione;

il ciclo di controllo non va bene, devi usare un while, non un for perché col for fai sempre lunghezza/2 confronti, col while devi uscire subito, per esempio su "pipa" il primo confronto è su 'p' ed 'a' che sono diversi e quindi il risultato deve essere false/0.
 
Aggiungo qualche altra osservazione.
Il conteggio dei caratteri della stringa puoi farlo utilizzando un'altra funzione (o seguire il consiglio di BAT, meglio ancora).

Separa l'implementazione dai messaggi in output: se stai verificando se la stringa è palindroma o no, restituisci true/false, e non void per poi "printare" direttamente nella funzione.

La variabile i la utilizzi come contatore, quindi dovresti limitarne lo scope dichiarandola nel ciclo for(int i=0;...).
 
Ho modificato il codice seguendo i vostri suggerimenti ma mi dà sempre lo stesso output incorretto.

C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define DIM 20


void palindroma(char str[])
{
  
    int i = 0;                      // indice di dx
    int j = strlen(str);        // indice di sx

  
    while (j > i){             
  
        if (str[i++] != str[j--]){
          
            printf("La stringa NON è palindroma.\n");
            return;
          
        }
    }
  
    printf("La stringa è palindroma.\n");
}


int main()
{
    char s[DIM];
  
    printf("Inserisci una stringa: ");
    scanf("%s", &s[DIM]);
  
    palindroma(s);
  
    return 0;
}
 
j è errato, inizialmente ha indice strlen(stringa)-1 perché, per esempio, una stringa di lunghezza 10 ha come primo indice 0 e ultimo indice 9 (l'indice 10 è l'11° carattere che è lo '\n');
inoltre fai una stampa, sarebbe meglio restituire 0/1
 
Non hai esattamente seguito i suggerimenti in realtà... La funzione non restituisce un boolean (o visto che utilizzi C, 0/1, sempre se non puoi importare stdbool.h).
E se usi la condizione del while, non ti serve nemmeno l'if all'interno.

Hint1: stai sbagliando a leggere l'input, guarda bene cosa stai passando a scanf.
Hint2: input: "radar" -> lunghezza 5 -> l'array ha quindi indici [0..5) (il 5 è escluso) (mi ha preceduto BAT).
 
Allooora: spero di avere azzeccato ciò che mi avete consigliato per il programma (perdonatemi ma sono alle prime armi con programmazione quindi mi serve un po' per carburare e arrivare alla soluzione). Probabilmente avrò sbagliato qualcosa e magari la soluzione è molto più banale del previsto ma per ora, io non la vedo :oogle:

C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

#define DIM 20
 
  bool x = 1;
  bool y = 0;

void palindroma(char str[]) {
    
    int i = 0;                      // indice di dx
    int j = strlen(str) - 1;        // indice di sx
    
    while (j > i){               // metti a confronto gli indici
        
        i++;
        j--;
        
    }
        
}
 
 
int main() {
    char s[DIM];
    
    printf("Inserisci una stringa: ");
    scanf("%s", s[DIM]);
    
    palindroma(s);
    
    if(palindroma){
        printf("%d\n", x);
    } else {
        printf("%d\n", y);
    }
    
    return 0;
}
 
si ma guarda che dopo aver scritto il programma devi fare i test;
questo programma è impossibile che funzioni, non c'è il test di confronto tra i caratteri puntati dagli indici;
devi aggiungerlo nel test del while
C:
while (j > i && str[j]==str[i])
e manca (all fine della funzione) il test alla fine sugli indici: devi controllare che j<=i ed in tal caso la stringa è palindroma altrimenti non lo è

inoltre "palindroma" è void, non restituisce un booleano o un 1/0 per dire vero/falso, non devi metterla come controllo nell'if ma fare in modo che restituisca un int (1 se la stringa è palindroma, 0 se non lo è)
 
Ultima modifica:
E in coda aggiungo: stai ancora sbagliando a leggere l'input.
Se hai un array di char lungo DIM, non puoi passare s[Dim] in quanto l'input viene memorizzato a partire da s[DIM].
Quindi se l'indirizzo base è, per dire, 0 e DIM vale 10, la tua stringa viene memorizzata a partire dalla posizione 10. Quindi anche se il tuo codice fosse tutto corretto, non funzionerebbe.

In pratica stai scrivendo su altre aree dello stack che si trovano dopo al tuo array.


Ps. non ti preoccupare se non vedi la soluzione ora, non sei lontanissimo. Segui qualche dritta e soprattutto apporta le correzioni.
Noi non ti diamo il codice proprio per farti ragionare sul problema. ;)
 
Pubblicità
Pubblicità
Indietro
Top