PDA

Visualizza la versione completa : lunghezza stringhe diverse tra struct.string e string


markzzz
18-05-2010, 15:50
salve.

io ho questa struttura :


struct msg {
char mex[10];
};

nella quale memorizzo questo :


struct msg m;
sprintf(m.mex, "%s", "end_of_tr1");

poi per se faccio questo confronto :


if(m.mex=="end_of_tr1")

non me le reputa uguali... com' possibile?
controllando con sizeof le due stringhe, m.mex lunga 10, "end_of_tr1" lunga 11.

sono in acido?
cordiali saluti :)

MItaly
18-05-2010, 15:57
Le stringhe in C sono degli array di caratteri, e se si usa l'operatore == gli array si "degradano" a puntatori; di conseguenza, un test di uguaglianza effettuato con == d come risultato true solo se le due stringhe si trovano alla medesima locazione di memoria (ossia, sono la medesima stringa). Per confrontare invece il contenuto di due stringhe (ossia i loro caratteri), si usa la funzione strcmp.

Tra l'altro, la stringa mex non sufficientemente ampia per contenere il messaggio che ci stai copiando dentro, dal momento che per esso sono necessari 10 caratteri (di testo effettivo) pi il terminatore di stringa NUL, per un totale di 11 caratteri.

Inoltre, in quella circostanza non necessario usare sprintf, basta strcpy; in ogni caso ti consiglio di usare sempre le versioni counted delle funzioni di manipolazione delle stringhe (snprintf, strncpy, ...) onde evitare buffer overflow.

oregon
18-05-2010, 15:58
A conclusione delle osservazioni di MItaly ti suggerirei di rivedere (e anche bene) il capitolo del tuo libro di C riguardante le stringhe, perch sembra che tu non l'abbia neanche aperto ...

markzzz
18-05-2010, 16:40
cavolo vero, non mi ricordavo questa cosa della degradazione a puntatori con gli array. ho programmato in C circa 5-6 anni f, poi son passato a java, poi php, ecc ecc...dimenticandomi alcune nozioni "fondamentali".

grazie per le delucidazioni :)

MItaly
18-05-2010, 16:40
Prego, ciao! :ciauz:

Loading