Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    305

    confronto di 2 stringhe c/c++

    Leggo in input il file AGENDA.txt.........
    sia col turbo c++ 3.0 e vc 6.0
    nessun errore.............ma non confronta la stringa nom con la stringa nome, dove se uguale dovrebbe avvertire che tale nome è presente in agenda!!!!!!!

    questo è il listato:

    .......inizializzo le variabili
    char nome[20];
    char info[20];
    char tele[20];

    char nom[20];
    char inf[20];
    char tel[20];
    ----------------------

    //Routine di lettura input
    cout<<"Registrare i dati ? s/n ";
    cin>>ch;

    if (ch=='n') {

    } else {
    fstream fi;
    fi.open("AGENDA.txt",ios::in);

    while (!fi.eof()){
    fi>>nom;

    if (nome==nom) {//...... quì non entra mai, ma col debug le variabili
    //sono identiche, tipo Nome=pippo e num=pippo estratto dalla lettura
    //del file

    cout<<"Nome presente in AGENDA....";
    fi.close();
    getch();
    DisplayMenu();
    return;
    }
    fi>>inf;
    fi>>tel;



    }

    fi.close();

    fstream fo;
    fo.open("AGENDA.txt",ios::app);

    fo<<nome<<endl;
    fo<<info<<endl;
    fo<<tele<<endl;
    }

    //getch(); //waits for a key to be entered
    fine:
    DisplayMenu();
    }





    quale è il problema??
    ora vado a dormire (pocco giuda!!!)

  2. #2
    codice:
    if (nome==nom) {//...... quì non entra mai, ma col debug le variabili
    
    sostituisci con
    
    if( ! strcmp(nom, nome) )
        //le stringhe sono uguali
    else
        //le stringhe sono diverse
    p.s. anche se le due stringhe contengono lo stesso NOME,
    sono di lunghezza diversa.

    ES:
    codice:
    nom="pippo\0"
    nome="pippo          \0"
    dove:

    nom == 6 char
    nome == 16 char

    in questo caso, nome e nom sono differenti (anche se all'utente potrebbero sembrare identiche)

    n.b. per utilizzare la funzione strcmp() devi includere l'header
    <string.h> in c++ <cstring>
    ...Terrible warlords, good warlords, and an english song

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Anche se le due stringhe sono uguali il confronto tramite l'operatore == dovrebbe restituire false.
    codice:
    char str1[5] = "Ciao";
    char str2[5] = "Ciao";
    
    if (str1 == str2) {
       // non entrerà mai
    }
    Semplicemente perchè, trattandosi di array, str1 e str2 rappresentano entrambi un puntatore al primo carattere dell'array... essendo 2 gli array, avranno 2 differenti locazioni in memoria... confrontandole, quindi, si ottiene FALSE.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Orig. inviato da LeleFT

    char str1[5] = "Ciao";
    char str2[5] = "Ciao";

    if (str1 == str2) {
    // non entrerà mai
    }
    GIUSTO!!!

    per confrontare i due "valori" basta aggiungere l'operatore *

    char str1[5] = "Ciao";
    char str2[5] = "Ciao";

    if (*str1 == *str2)
    // entrerà sempre

    cmq nel tuo caso, non conoscendo la lunghezza delle due stringhe,
    utilizza strcmp()

    UPGRADE
    Ho scritto una caz***a :quipy:
    in quanto sia *str1 che *str2, puntano al primo elemento dell'array
    nell'esempio, a 'C'
    Credo che in giornata farò un ripasso dei puntatori.

    p.s. utilizzando il tuo esempio,

    dovresti confrontare ogni singolo *elemento dei due array:

    if(str1[0]==str2[0]
    if(str1[1]==str2[1]
    if(str1[2]==str2[2]
    ... ecc ...

    se le due stringhe sono uguali (stessi caratteri/stessa lunghezza)
    il codice restituirà 1. (ma visto che hanno inventato già la funzione
    strcmp() perchè riscriverla? )
    ...Terrible warlords, good warlords, and an english song

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    305
    Grazie

    sono cose non documentate o ci devi arrivare con l'esperienza.

  6. #6
    Sono cose documentate molto bene,
    ma in C/C++ è facile distrarsi.
    Quindi l'esperienza gioca un ruolo importantissimo.

    Questa funzione è la "sorella minore" di strcmp()
    codice:
    int comp(char *s1, char *s2)
    {
        int i=0;
        
        if( strlen(s1) != strlen(s2) )
            return 1;
        else
        {
            while( s1[i] != '\0' )
            {
                if( s1[i] == s2[i] )
                    i++;
                else
                    return 1;      
            }
        }          
        
        return 0; // 0 == uguali, 1 == diverse
    }
    p.s. sorella minore, in quanto strcmp()
    restituisce 3 valori:

    -1 se s1 < s2
    0 se sono uguali
    1 se s1 > s2


    p.s. altrimenti potresti utilizzare la classe <string>
    del C++:

    string s = "CIAO";

    if( s == "CIAO" )
    cout << "uguali";
    ...Terrible warlords, good warlords, and an english song

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.