Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,035

    [C/C++] Operatori di uguaglianza su membri di struct di tipo puntatore a char

    Rieccomi con le mie amate stringhe

    Allora, ho una struttura che fra tutti i membri contiene anche un membro di struttura di tipo puntatore a char, creo un vettore unidimensionale di questo tipo e lo arricchisco. Poi con gli operatori logici verifico il contenuto di ogni elemento di questo puntatore a char (es: nomevettore[i].a) con quello che segue (if nomevettore[i].a>nomevettore[i].b) soltanto che funziona perfettamente quando il confronto avviene fra due interi o due char, ma fra due puntatori a char non avviene correttamente... sembra non verificare nessuna uguaglianza

    magari butto giù due righe per caprci meglio? non ho il codice sotto mano...

  2. #2
    Mmmm effettivamente non ho capito del tutto ma se vuoi solamente confrontare l'array di caratteri puntato esiste la funzione strcmp definita in string.h senza dover fare il confronto su tutti gli indici dell'array, ecco un esempio:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct _prova{
            char *c;
    } prova;
    
    int main()
    {
        prova a,b;
        a.c = (char*)malloc(20);
        b.c = (char*)malloc(32);
        strcpy(a.c,"primo");
        strcpy(b.c,"secondo");
        if(strcmp(a.c,b.c) == 0)
           printf("membri struttura uguali\n");
        else
           printf("membri struttura diversi\n");
        system("pause");
        return 0;
    }

  3. #3
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,035
    Ecco cosa intendo... il confronto fra i membri di tipo puntatore a char non producono nessun ordinamento... forse è come dici tu anche nel mio caso? io poi non alloco niente...

    codice:
    struct db{
       int id;
       char *Nome;
       char carattere;
    };
    void swap(struct db *Ptr, struct db *Ptr2);
    
    int main(){
    int i,j,s;
    struct db n[8]={{1, "Marco",  's'}, {2, "Luca", 'b'},
                    {3, "Franco", 'g'}, {4, "Mario", 'z'},
                    {5, "aaaaa", 'q'}, {6, "Bbbb",'f'},
                    {7, "Ccccc", 'a'}, {8, "Ddd", 'w'}};
                                  
    s=0;
    while (s!=1){
       s=1;
       for (i=0; i<7; i++)
          if (n[i].Nome > n[i+1].Nome){
             swap(&n[i], &n[i+1]);
             s=0;
          }
       }
    
    for (j=0; j<8; j++)
       printf("%d %s %c\n", n[j].id, n[j].Nome, n[j].carattere);
    
    return 0;
    }
    
    void swap(struct db *Ptr, struct db *Ptr2){
    struct db temp;
    
       temp=*Ptr;
       *Ptr=*Ptr2;
       *Ptr2=temp;
    }

  4. #4
    Non ha nessun senso confrontare dei puntatori a char, perché l'operatore di confronto ti dirà se l'area di memoria a cui punta il puntatore viene prima o dopo di quella a cui punta l'altro. Per fare confronti tra stringhe devi usare la strcmp, come ti è già stato suggerito (e magari anche una ripassatina ad un manuale di C non guasterebbe ).
    Ciao
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480

    Re: [C/C++] Operatori di uguaglianza su membri di struct di tipo puntatore a char

    Originariamente inviato da Lak3d
    ... fra due puntatori a char non avviene correttamente...
    I puntatori a char rappresentano l'indirizzo in memoria del dato , non il dato ...

    Quindi, se tu hai due stringhe in memoria, ad esempio

    "CARLO"

    "ANTONIO"

    facendo il confronto tra puntatori, non confronti CARLO con ANTONIO ma i valori numerici degli indirizzi della prima cella di memoria occupata dalle due stringhe (che ovviamente non ha alcun rapporto con i contenuti delle stringhe).

    Per confrontare i dati devi usare la strcmp o scrivere una tua strcmp che estragga carattere per carattere dalle due stringhe (a partire dagli indirizzi) e li confronti.

  6. #6
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,035
    ma la funzione strcmp allora risolve il riferimento dei puntatori visto che come argomento gli passo proprio quelli? non c'è un modo per passargli direttamente quei valori così come succede con l'operatore *? :master:

    ps: se invece di operare nel seguente modo:
    codice:
    void swap(struct db *Ptr, struct db *Ptr2){
    struct db temp;
    
       temp=*Ptr;
       *Ptr=*Ptr2;
       *Ptr2=temp;
    }

    facessi in questo:
    codice:
    void swap(struct db *Ptr, struct db *Ptr2){
    struct db temp;
    
       temp.Nome=Ptr->Nome;
       temp.id=Ptr->id;
       temp.carattere=Ptr->carattere;
       Ptr->id=Ptr2->id;
       Ptr->Nome=Ptr2->Nome;
       Ptr->carattere=Ptr2->carattere;
       Ptr2->id=temp.id;
       Ptr2->Nome=temp.Nome;
       Ptr2->carattere=temp.carattere;
    }
    cosa ci guadagno/perdo?

    Grazie.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Lak3d
    ma la funzione strcmp allora risolve il riferimento dei puntatori visto che come argomento gli passo proprio quelli?
    Ovviamente. E' normale.

    Originariamente inviato da Lak3d
    non c'è un modo per passargli direttamente quei valori così come succede con l'operatore *? :master:
    Non capisco ... perche' passare i dati se si possono passare i puntatori?

    Originariamente inviato da Lak3d
    ps: se invece di operare nel seguente modo:
    codice:
    void swap(struct db *Ptr, struct db *Ptr2){
    struct db temp;
    
       temp=*Ptr;
       *Ptr=*Ptr2;
       *Ptr2=temp;
    }

    facessi in questo:
    codice:
    void swap(struct db *Ptr, struct db *Ptr2){
    struct db temp;
    
       temp.Nome=Ptr->Nome;
       temp.id=Ptr->id;
       temp.carattere=Ptr->carattere;
       Ptr->id=Ptr2->id;
       Ptr->Nome=Ptr2->Nome;
       Ptr->carattere=Ptr2->carattere;
       Ptr2->id=temp.id;
       Ptr2->Nome=temp.Nome;
       Ptr2->carattere=temp.carattere;
    }
    cosa ci guadagno/perdo?

    Grazie.
    Esegui piu' linee e perdi piu' tempo per ottenere gli stessi risultati ...

  8. #8
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,035
    Originariamente inviato da oregon
    Non capisco ... perche' passare i dati se si possono passare i puntatori?
    Perchè invece di usare strcmp facevo un confronto normalissimo fra i due elementi risolvendo il puntatore visto che con l'operatore * solitamente si risolve il riferimento... vabbè fa ninete, è uguale

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Lak3d
    Perchè invece di usare strcmp facevo un confronto normalissimo fra i due elementi risolvendo il puntatore visto che con l'operatore * solitamente si risolve il riferimento... vabbè fa ninete, è uguale
    Non puoi fare un confronto "normalissimo" ... le stringhe sono sequenze di byte e i byte li devi confrontare uno ad uno ...

    Non riesco quindi a comprendere il tuo discorso ... non e' una questione che si e' scelto di fare cosi' ma che si deve fare cosi' ...

    In ogni caso, il consiglio che ti posso dare e' di dare una ulteriore ripassata all'uso e all'importanza dei puntatori ... devi avere questi concetti molto, molto chiari per potere andare avanti con il C ...

  10. #10
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,035
    beh, la mia domanda nasceva dal fatto che se passo a duna printf numeri.Nome mi stampa la stringa, quindi un paragone con un operatore logico dovrebbe paragonare le due stringhe...

    questo almeno lo credevo ovvio fino a ieri...

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 © 2025 vBulletin Solutions, Inc. All rights reserved.