std::memcmp în C++

Compară n octeți din două zone de memorie: 0 dacă sunt identici.

Sintaxă
#include <cstring>
int memcmp(const void* a, const void* b, std::size_t n);

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: memcmp compară 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.