Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23
  1. #1

    [C] Problema con una funzione che confronta due stringe

    Salvez a todos ^^ mi avrete addosso per un bel po dato che sto facendo 'sperimenti ^^

    allora...io ho questa funzione

    codice:
    int compare(const void *pa, const void *pb, const void *config) {
            int size1, size2, i;
            size1 = sizeof((char *)pa);
            size2 = sizeof((char *)pb);
    
            printf("Sizes: [%s]%i - [%s]%i\n", (char *)pa, size1, (char *)pb, size2);
    
            if (size1>size2) return 1;
            if (size2>size1) return -1;
    
            for (i=0; i<size1;i++) {
                if ((char *)pa == 0) break;
    
                printf("Content[%i]: %c - %c\n", i, (char *)pa, (char *)pb);
    
                if ((char *)pa > (char *)pb) return 1;
                if ((char *)pb > (char *)pa) return -1;
                pa++;
                pb++;
            }
    
            return 0;
    }
    che deve confrontarmi due dati (lasciate perdere il terzo parametro)
    i due dati in questione sono i puntatori a due stringhe

    anche xche non capisco xche usando sizeof mi restituisca 4 (la dimensione di un INT) mentre usando printf mi stampi la stringa :\

    infati size1 e size2 sono uguali

    se le due stringhe sono di lunghezza uguale confronto carattere per carattere...e se ne trovo 1 + grande ritorno 1 o -1

    se nn trovo nulla...mi ritorna zero

    ora il problema è questo
    1° mi serve leggere la lunghezza della stringa (how?)
    2° mi serve confrontare carattere per carattere per vedere quallo + alto o + basso

    il codice è "mezzo" funziante...

    idee?

  2. #2
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    codice:
    #include <cstring>
    
    //confronta le stringhe
    strcmp(char *s1,char *s2);
    
    //lunchezza della stringa
    strlen(char *s);
    sizeof() è un operatore a livello di compilazione che restituisce la lunghezza in byte di un tipo!
    E' 4 perchè lui ti dice la lunghezza di un PUNTATORE a carattere!


  3. #3
    Originariamente inviato da iguana13
    codice:
    #include <cstring>
    
    //confronta le stringhe
    strcmp(char *s1,char *s2);
    
    //lunchezza della stringa
    strlen(char *s);
    sizeof() è un operatore a livello di compilazione che restituisce la lunghezza in byte di un tipo!
    E' 4 perchè lui ti dice la lunghezza di un PUNTATORE a carattere!

    MALOL
    era cosi semplice e mi stavo disperando

    ^^


  4. #4
    Utente di HTML.it L'avatar di pixer
    Registrato dal
    Oct 2000
    Messaggi
    614
    Originariamente inviato da daniele_dll
    MALOL
    era cosi semplice e mi stavo disperando

    ^^

    daniè..
    MySQL Worker - The OpenSource Multiplatform MySQL database Administrator (C++ powered)
    .:[ It resumes the development !! ]:.


  5. #5
    un'ultima domanda

    se ho un puntatore chiamato p e contiene una stringa

    come faccio a leggere il suo contenuto?
    andando per assurdo che nn voglio usare strcmp, anche se ho giò sistemato il codice per usarlo, come posso sistemare il mio codice? anche per capire ^^

  6. #6
    Originariamente inviato da pixer
    daniè..
    te programmi in C\C++ da MOLTO + tempo di me...io da ieri ^^

  7. #7
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    devi confrontarlo carattere per carattere

  8. #8
    Originariamente inviato da iguana13
    devi confrontarlo carattere per carattere
    e proprio quello che nn so fare

    codice:
            for (i=0; i<size1;i++) {
                if ((char *)pa > (char *)pb) return 1;
                if ((char *)pb > (char *)pa) return -1;
                pa++;
                pb++;
            }
    ad es qui come dovrei sistemare il mio codice?
    premettendo che size1 indica appunto la lunghezza...

    le ultime due istruzioni del ciclo servono x spostarmi col puntatore avanti...ma poi?
    questo codice va bene?

  9. #9
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Tanto per mostrare ecco una funzione che misura la lunghezza e confronta due stringhe:
    codice:
    int compare(const char *s1, const char *s2)
    {
    //due interi
        int len1,len2;
    //due puntatori
        char *p1 = s1, *p2 = s2;
    //Traduzione:
    //Finchè in carattere puntato da p1 è un valore vero (*p1)
    //cioè non è '\0', il carattere che termina la stringa
    //incrementa l'indirizzo a cui punta p1 (p1++) , in modo da puntare
    //al carattere successivo
    //ed incrementa la lunghezza di un carattere
    //
    //NOTA:
    //Per accorciare e far diventare + illeggibile,
    //ho combinato *p1 con p1++ formando *p1++
        while(*p1++) len1++;
    //Idem per p2
        while(*p2++) len2++;
    
    //ok ora ho trovato la lunghezza  :sexpulp: 
    
    //reinizializzo i puntatori
        p1 = s1; p2 = s2;
    //Finchè non termina almeno una stringa (operatore AND)
        while (*p1++ && *p2++)
        {
            if(*p1 < *p2) {
    //la stringa 1 è la minore
                return -1;
            }
            else if(*p1 > *p2) {
                return 1;
            }
        }
        if (len1 < len2) {
            //Se la stringa 1 è più corta, allora è minore
            return -1;
        }
        else if(len1 > len2){
            return 1;
        }
        else {
    //sono incredibilmente UGUALI!!!
            return 0;
        }
    }

  10. #10
    Utente di HTML.it L'avatar di pixer
    Registrato dal
    Oct 2000
    Messaggi
    614
    Originariamente inviato da daniele_dll
    un'ultima domanda

    se ho un puntatore chiamato p e contiene una stringa

    come faccio a leggere il suo contenuto?

    andando per assurdo che nn voglio usare strcmp, anche se ho giò sistemato il codice per usarlo, come posso sistemare il mio codice? anche per capire ^^
    codice:
    	char *s1 = "prova";
    	char *s2 = "prova";
    	char **s = &s1; // punatore a s1
    
    	if(! strcmp(*s,str2) )
    		cout << "le stringhe sono uguali" << endl;
    	else
    		cout << "le stringhe non sono uguali" << endl;
    al valore del puntatore accedi con l'operatore di deferenziazione *.
    MySQL Worker - The OpenSource Multiplatform MySQL database Administrator (C++ powered)
    .:[ It resumes the development !! ]:.


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.