Ce face std::memcmp
memcmp compară primii n octeți din două zone, ca strcmp, dar nu se oprește la '\0'. Returnează 0 dacă sunt identici, altfel un număr negativ sau pozitiv, după primul octet diferit.
Este potrivit pentru date binare: semnături de fișiere, tablouri de numere, coduri. Nu este potrivit pentru structuri cu spații libere între câmpuri (padding), unde octeții neinițializați pot diferi.
Parametri
| Parametru | Descriere |
|---|---|
a, b |
Zonele comparate. |
n |
Numărul de octeți comparați. |
Ce returnează
Un int: negativ, 0 sau pozitiv.
Exemple
Exemplul 1: Recunoașterea unui fișier PNG după primii octeți
#include <cstdio>
#include <cstring>
int main() {
const unsigned char semnatura_png[] = {0x89, 'P', 'N', 'G'};
const unsigned char fisier1[] = {0x89, 'P', 'N', 'G', 0x0D, 0x0A};
const unsigned char fisier2[] = {0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10};
std::printf("fisier1: %s\n", std::memcmp(fisier1, semnatura_png, 4) == 0 ? "PNG" : "altceva");
std::printf("fisier2: %s\n", std::memcmp(fisier2, semnatura_png, 4) == 0 ? "PNG" : "altceva");
}
Rezultat
fisier1: PNG
fisier2: altceva
Exemplul 2: Două tablouri de numere identice?
#include <cstdio>
#include <cstring>
int main() {
int a[] = {1, 2, 3, 4};
int b[] = {1, 2, 3, 4};
int c[] = {1, 2, 9, 4};
std::printf("a și b: %s\n", std::memcmp(a, b, sizeof(a)) == 0 ? "identice" : "diferite");
std::printf("a și c: %s\n", std::memcmp(a, c, sizeof(a)) == 0 ? "identice" : "diferite");
}
Rezultat
a și b: identice
a și c: diferite
Greșeli frecvente
- Compari structuri cu
memcmp: octeții de umplere dintre câmpuri pot avea valori întâmplătoare, deci două structuri egale pot ieși diferite. - Folosești semnul rezultatului pentru a compara numere
int:memcmpcompară octeții în ordinea din memorie, care pe procesoarele obișnuite (little-endian) nu este ordinea numerică.
Comenzi înrudite
std::memcpy: Copiază n octeți dintr-o zonă de memorie în alta; memmove permite zone suprapuse.std::memset: Umple n octeți de memorie cu aceeași valoare, de obicei pentru a pune totul pe zero.std::strcmp: Compară două șiruri C: 0 dacă sunt egale, negativ sau pozitiv după ordinea lor.