Errore strcmp

di il
40 risposte

40 Risposte - Pagina 2

  • Re: Errore strcmp

    SVNiko ha scritto:


    Come tu dici la strlen ritorna la lunghezza di due strighe, ovvero:

    strlen(pippa); //ritorna 5
    strlen(pippo); //ritorna 5

    mentre la strcmp ritorna l'ordine alfabetico di due stringhe seguendo il codice ASCII, infatti

    strcmp(pippo, pippa); //ritorna -1, cioè la stringa pippo segue la stringa pippa
    strcmp(pippo, pippo); //ritorna 0, cioè le stringhe sono uguali
    strcmp(pippa, pippo); //ritorna 1, cioè la stringhe pippa precede la stringa pippa

    Esatto. Non è forse così?
  • Re: Errore strcmp

    oregon ha scritto:


    Rifaccio la domanda ... nel caso le due stringhe siano eguali (con la strcmp), quale insert esegui?
    Non rispondi ...
  • Re: Errore strcmp

    Non ho capito bene la domanda.
    Per come ho scritto io il codice (che non funziona) quando sono uguali non inserisco niente. Perchè non voglio ripetizioni. Ma ripeto.. non funziona... quindi evidentemente sbaglio qualcosa, o mi manca qualche passaggio.
  • Re: Errore strcmp

    A me sembra funzionare. Facendo un paio di correzioni ad altre parti del codice.

    Ad ogni modo c'è un'assegnazione all'interno di un if l'ho segnalata, ma è un problema.
    main.c
    
    #include <stdio.h>
    #include <stdlib.h>
    #include "abr.h"
    
    
    int main() {
        int esci=0, scelta=11, continua;
        ABR albero=NULL;
        char *stringa, *stringa1, *stringa2;
        char risp;
        int x;
    
        while(!esci) {
            switch(scelta) {
            case 1:
                printf("Inserisci stringa: ");
                stringa=leggi();
                albero=abr_insert(albero,stringa);
                printf("Digita 1 per tornare al menu principale, o qualsiasi tasto per uscire.\n");
                scanf("%d",&continua);
                if (continua==1) scelta=11;
                else esci=1;
                break;
            case 2:
                if(albero!=NULL) abr_stampa(albero);
                else printf("Abr vuoto.\n");
                printf("Digita 1 per tornare al menu principale, o qualsiasi tasto per uscire.\n");
                scanf("%d",&continua);
                if (continua==1) scelta=11;
                else esci=1;
                break;
            case 3:
                if (albero!=NULL) {
                    albero=abr_svuota(albero);
                    printf("Abr svuotato.\n");
                } else printf("Abr gia' vuoto.\n");
    
                printf("Digita 1 per tornare al menu principale, o qualsiasi tasto per uscire.\n");
                scanf("%d",&continua);
                if (continua==1) scelta=11;
                else esci=1;
                break;
            case 4:
                if (albero==NULL) printf("Abr vuoto.");
                else {
                    printf("Quale stringa vuoi cancellare? ");
                    stringa=leggi();
                    albero=abr_cancel(albero,stringa);
                }
                printf("Digita 1 per tornare al menu principale, o qualsiasi tasto per uscire.\n");
                scanf("%d",&continua);
                if (continua==1) scelta=11;
                else esci=1;
                break;
            case 5:
                printf("\nInserisci due strighe entro le quali vuoi sia compreso il valore di quella\nda eliminare (in ordine crescente):\n1) ");
                stringa1=leggi();
                printf("2) ");
                stringa2=leggi();
                printf("Se vuoi eliminare una stringa di lunghezza pari, digita un numero pari, \naltrimenti digita un numero dispari: ");
                scanf("%d", &x);
                printf("Sono state eliminate, perche' rispecchiano i criteri scelti, le stringhe: ");
              //  albero=abr_cancellaparidispari(albero,x,stringa1,stringa2);
    
                printf("Digita 1 per tornare al menu principale, o qualsiasi tasto per uscire.");
                scanf("%d",&continua);
                if (continua==1) scelta=10;
                else esci=1;
                break;
            case 9:
                esci=1;
                break;
            case 11:
                printf("\n\t\t**************** MENU ****************\n\n");
                printf("1) Aggiungi una stringa all'abr.\n");
                printf("2) Stampa contenuto abr.\n");
                printf("3) Svuota abr.\n");
                printf("4) Cancella un nodo dall'abr.\n");
                printf("5) Cancella una stringa con lunghezza pari o dispari, e con valore \n   compreso tra due stringhe scelte.\n");
                printf("9) Esci. \n\n\n");
                printf("\nInserisci la tua scelta: ");
                scanf("%d%*c",&scelta);
                break;
                /*case :
                     printf("Scelta non valida");
                     scelta=11;
                     break;*/
            }
        }
        printf("\nBye!\n");
        system("PAUSE");
        return 0;
    
    
    }
    
    abr.h
    #ifndef RB_H_INCLUDED
    #define RB_H_INCLUDED
    
    
    typedef struct abr * ABR;
    
    char * leggi (void);
    ABR abr_insert(ABR t, char *elem);
    void abr_stampa(ABR t);
    ABR abr_svuota(ABR t);
    ABR abr_cancel(ABR t, char *elem);
    ABR abr_staccamin(ABR p_t, ABR t);
    
    
    #endif // RB_H_INCLUDED
    abr.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "abr.h"
    
    typedef struct abr {
        char *str;
        struct abr *sx;
        struct abr *dx;
    } abr;
    
    char * leggi (void) {
        char *s = (char *)malloc(80*sizeof(char));
        scanf ("%s",s);
        return s;
    }
    /*
    ABR abr_insert(ABR t, char *elem) {
        if (t!=NULL) {
    
            if (strlen(elem)<=strlen(t->str))
            t->sx=abr_insert(t->sx,elem);
            else t->dx=abr_insert(t->dx,elem);
    
            return t;
        }
    
        else {
            ABR nodo=(abr *)malloc(sizeof(abr));
            nodo->str=elem;
            nodo->sx=NULL;
            nodo->dx=NULL;
            return nodo;
        }
    }
    */
    ABR abr_insert(ABR t, char *elem) {
        if (t!=NULL) {
    
            if (strcmp(elem,t->str)<0)
                t->sx=abr_insert(t->sx,elem);
            else if (strcmp(elem,t->str)>0)
                t->dx=abr_insert(t->dx,elem);
    
            return t;
        }
    
        else {
            ABR nodo=(abr *)malloc(sizeof(abr));
            nodo->str=elem;
            nodo->sx=NULL;
            nodo->dx=NULL;
            return nodo;
        }
    }
    
    void abr_stampa(ABR t) {
        if (t!=NULL) {
            if (t->sx!=NULL) abr_stampa(t->sx);
    
            printf("%s\n",t->str);
    
            if(t->dx!=NULL) abr_stampa(t->dx);
        }
    
        else return;
    }
    
    ABR abr_svuota (ABR t) {
        if(t!=NULL) {
            if(t->dx!=NULL)
                t->dx=abr_svuota(t->dx);
            else if(t->sx!=NULL)
                t->sx=abr_svuota(t->sx);
    
        }
    
        return t;
    }
    
    ABR abr_cancel(ABR t, char *elem) {
        if (t!=NULL) {
            if ((strlen(elem))<(strlen(t->str))) t->sx=abr_cancel(t->sx,elem);
            else if ((strlen(elem))>(strlen(t->str))) t->dx=abr_cancel(t->dx,elem);
            else if ((strcmp(elem,t->str)) == 0 ) {
                ABR tmp=(abr *)malloc(sizeof(abr));
                tmp=t;
                if(tmp->sx == NULL) t=tmp->dx;
                else if (tmp->dx == NULL) t=tmp->sx;
                else {
                    tmp=abr_staccamin(t,t->dx);
                    strcpy(t->str,tmp->str);
                }
    
                free(tmp);
            }
        }
    
        return t;
    }
    
    ABR abr_staccamin(ABR p, ABR t) {
        if (t!=NULL) {
            if (t->sx!=NULL)
                return abr_staccamin(t,t->sx);
            else {
                if (t=p->sx) // Qui hai un'assegnazione sarà vera sempre
                    p->sx=t->dx;
                else
                    p->dx=t->dx;
            }
        }
    
        return t;
    }

    P.s.
    Ho messo sul pc e verificato molto velocemente il codice con le stringhe pippo, pippa e ripetendo la scrittura di pippo che non mi carica nell'albero come volevi tu.

    ATTENTA ai warning!
  • Re: Errore strcmp

    Sono confusa..
    c'è qualcosa che mi sfugge...

    scusami per esempio strcmp("ciao","mondo") cosa mi restituisce? -1?
  • Re: Errore strcmp

    Se uso un main semplice
    
        abr *albero=NULL;
        char *stringa;
        
    	while(1)
    	{
    		printf("Inserisci stringa: ");
    		stringa=leggi();
    
    		albero=abr_insert(albero,stringa);
    	}
    
    tutte le stringhe sono inserite correttamente.
  • Re: Errore strcmp

    violet_prog ha scritto:


    sono confusa..
    c'è qualcosa che mi sfugge...

    scusami per esempio strcmp("ciao","mondo") cosa mi restituisce? -1?
    Allora la convenzione è questa, più o meno sempre rispettata, la seconda nella prima.
    Se vedi la strcpy(a,b) cosa fa?
    Copia b in a.

    Vedila in maniera informale in questi termini, con la domanda la stringa mondo è prima di ciao?
    Risposta -1;
  • Re: Errore strcmp

    Ok allora non usavo strcmp in maniera inappropriata, ma avevo capito la sua funzione. E comunque a me se provo ad inserire varie stringhe, di lunghezze diverse (e quindi non semplicemente pippa e pippo), la funzione non svolge quello che a me serve, e cioè di inserire le stringhe ordinatamente..
  • Re: Errore strcmp

    Postami i dati che inserisci, ho provato mi sembra vada bene.
  • Re: Errore strcmp

    Ho corretto quell'assegnazione nel'if solo ora.. non me ne sarei mai accorta!
    Purtroppo devc++ non mi segnala i warning... compilava tranquillamente. Code::Block poi ebbi problemi a caricare le librerie quindi non lo sto usando..
  • Re: Errore strcmp

    SVNiko ha scritto:


    Postami i dati che inserisci, ho provato mi sembra vada bene.
    prova dando in input:
    ciao
    caro
    giocare
    mondo

    Se stampi il contenuto in che ordine ti escono?
  • Re: Errore strcmp

    **************** MENU ****************

    1) Aggiungi una stringa all'abr.
    2) Stampa contenuto abr.
    3) Svuota abr.
    4) Cancella un nodo dall'abr.
    5) Cancella una stringa con lunghezza pari o dispari, e con valore
    compreso tra due stringhe scelte.
    9) Esci.



    Inserisci la tua scelta: 1
    Inserisci stringa: ciao
    Digita 1 per tornare al menu principale, o qualsiasi tasto per uscire.
    1

    **************** MENU ****************

    1) Aggiungi una stringa all'abr.
    2) Stampa contenuto abr.
    3) Svuota abr.
    4) Cancella un nodo dall'abr.
    5) Cancella una stringa con lunghezza pari o dispari, e con valore
    compreso tra due stringhe scelte.
    9) Esci.



    Inserisci la tua scelta: 1
    Inserisci stringa: caro
    Digita 1 per tornare al menu principale, o qualsiasi tasto per uscire.
    1

    **************** MENU ****************

    1) Aggiungi una stringa all'abr.
    2) Stampa contenuto abr.
    3) Svuota abr.
    4) Cancella un nodo dall'abr.
    5) Cancella una stringa con lunghezza pari o dispari, e con valore
    compreso tra due stringhe scelte.
    9) Esci.



    Inserisci la tua scelta: 1
    Inserisci stringa: giocare
    Digita 1 per tornare al menu principale, o qualsiasi tasto per uscire.
    1

    **************** MENU ****************

    1) Aggiungi una stringa all'abr.
    2) Stampa contenuto abr.
    3) Svuota abr.
    4) Cancella un nodo dall'abr.
    5) Cancella una stringa con lunghezza pari o dispari, e con valore
    compreso tra due stringhe scelte.
    9) Esci.



    Inserisci la tua scelta: 1
    Inserisci stringa: mondo
    Digita 1 per tornare al menu principale, o qualsiasi tasto per uscire.
    1

    **************** MENU ****************

    1) Aggiungi una stringa all'abr.
    2) Stampa contenuto abr.
    3) Svuota abr.
    4) Cancella un nodo dall'abr.
    5) Cancella una stringa con lunghezza pari o dispari, e con valore
    compreso tra due stringhe scelte.
    9) Esci.



    Inserisci la tua scelta: 2
    caro
    ciao
    giocare
    mondo
    Digita 1 per tornare al menu principale, o qualsiasi tasto per uscire.
    ^C
    Process returned -1 (0xFFFFFFFF) execution time : 58.036 s
    Press ENTER to continue.
  • Re: Errore strcmp

    E non è esatto..
    perchè per come ho scritto la stampa, se l'inserimento fosse fatto bene dovrebbe stampare:
    caro
    ciao
    mondo
    giocare
  • Re: Errore strcmp

    **************** MENU ****************

    1) Aggiungi una stringa all'abr.
    2) Stampa contenuto abr.
    3) Svuota abr.
    4) Cancella un nodo dall'abr.
    5) Cancella una stringa con lunghezza pari o dispari, e con valore
    compreso tra due stringhe scelte.
    9) Esci.



    Inserisci la tua scelta: 1
    Inserisci stringa: secondo
    Digita 1 per tornare al menu principale, o qualsiasi tasto per uscire.
    1

    **************** MENU ****************

    1) Aggiungi una stringa all'abr.
    2) Stampa contenuto abr.
    3) Svuota abr.
    4) Cancella un nodo dall'abr.
    5) Cancella una stringa con lunghezza pari o dispari, e con valore
    compreso tra due stringhe scelte.
    9) Esci.



    Inserisci la tua scelta: 1
    Inserisci stringa: me
    Digita 1 per tornare al menu principale, o qualsiasi tasto per uscire.
    1

    **************** MENU ****************

    1) Aggiungi una stringa all'abr.
    2) Stampa contenuto abr.
    3) Svuota abr.
    4) Cancella un nodo dall'abr.
    5) Cancella una stringa con lunghezza pari o dispari, e con valore
    compreso tra due stringhe scelte.
    9) Esci.



    Inserisci la tua scelta: 1
    Inserisci stringa: mia
    Digita 1 per tornare al menu principale, o qualsiasi tasto per uscire.
    1

    **************** MENU ****************

    1) Aggiungi una stringa all'abr.
    2) Stampa contenuto abr.
    3) Svuota abr.
    4) Cancella un nodo dall'abr.
    5) Cancella una stringa con lunghezza pari o dispari, e con valore
    compreso tra due stringhe scelte.
    9) Esci.



    Inserisci la tua scelta: 1
    Inserisci stringa: cara
    Digita 1 per tornare al menu principale, o qualsiasi tasto per uscire.
    1

    **************** MENU ****************

    1) Aggiungi una stringa all'abr.
    2) Stampa contenuto abr.
    3) Svuota abr.
    4) Cancella un nodo dall'abr.
    5) Cancella una stringa con lunghezza pari o dispari, e con valore
    compreso tra due stringhe scelte.
    9) Esci.



    Inserisci la tua scelta: 1
    Inserisci stringa: funziona
    Digita 1 per tornare al menu principale, o qualsiasi tasto per uscire.
    1

    **************** MENU ****************

    1) Aggiungi una stringa all'abr.
    2) Stampa contenuto abr.
    3) Svuota abr.
    4) Cancella un nodo dall'abr.
    5) Cancella una stringa con lunghezza pari o dispari, e con valore
    compreso tra due stringhe scelte.
    9) Esci.



    Inserisci la tua scelta: 2
    cara
    funziona
    me
    mia
    secondo
    Digita 1 per tornare al menu principale, o qualsiasi tasto per uscire.
    ^C
    Process returned -1 (0xFFFFFFFF) execution time : 46.172 s
    Press ENTER to continue.
    E' corretto l'ordine? Oppure non è questo quello che vuoi.
  • Re: Errore strcmp

    violet_prog ha scritto:


    e non è esatto..
    perchè per come ho scritto la stampa, se l'inserimento fosse fatto bene dovrebbe stampare:
    caro
    ciao
    mondo
    giocare
    Ma perchè?

    mondo viene dopo di giocare.
Devi accedere o registrarti per scrivere nel forum
40 risposte