PDA

Visualizza la versione completa : confronto di 2 stringhe c/c++


scancode
15-10-2003, 04:13
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!!!)

Johnny_Depp
15-10-2003, 09:56
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:

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>

LeleFT
15-10-2003, 10:26
Anche se le due stringhe sono uguali il confronto tramite l'operatore == dovrebbe restituire false.


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.

Johnny_Depp
15-10-2003, 10:47
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. :stordita:

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? :) )

scancode
15-10-2003, 11:54
Grazie

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

Johnny_Depp
15-10-2003, 12:08
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()

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";

Loading