DOMANDA Funzione palindroma in C

Witchenza

Nuovo Utente
13
3
OS
Windows 7 Ultimate
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;
}
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,902
11,552
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
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.
 
  • Mi piace
Reazioni: DispatchCode

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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;...).
 
  • Mi piace
Reazioni: BAT e _Achille

Witchenza

Nuovo Utente
13
3
OS
Windows 7 Ultimate
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;
}
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,902
11,552
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
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
 
  • Mi piace
Reazioni: DispatchCode

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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).
 

Witchenza

Nuovo Utente
13
3
OS
Windows 7 Ultimate
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;
}
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,902
11,552
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
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:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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. ;)
 
  • Mi piace
Reazioni: BAT

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili