memcmp(3)

Fonction de la bibliothèque C

Compare deux zones sur n octets interprétés comme unsigned char. Seul le signe du résultat compte ; les deux zones doivent contenir les octets demandés.

memcmp(apremière
zone
, bseconde
zone
, 3taille
octets comparés
);

Renvoie< 0première avant0octets égaux> 0première après

Synopsis
#include <string.h>
int memcmp(const void *s1, const void *s2, size_t n);

Description

memcmp compare les n premiers octets de deux zones mémoire, dans leur ordre d'apparition. Chaque octet est interprété comme un unsigned char. Un octet nul ne termine pas la comparaison : il fait partie des données binaires. La première différence détermine le signe du résultat ; si tous les octets demandés sont égaux, le résultat est zéro.

Les deux pointeurs doivent désigner des objets contenant au moins n octets lisibles. La fonction ne reçoit pas leur capacité et ne peut pas la vérifier. Avec une taille nulle et des pointeurs valides, elle renvoie zéro.

Valeur de retour

Un entier négatif, nul ou positif selon l'ordre des zones. Seul le signe est portable : teste < 0, == 0 ou > 0, jamais une amplitude précise comme == -1.

Pièges

Comparer le préfixe commun de deux buffers de longueurs différentes ne teste pas leur égalité complète. Vérifie leurs longueurs avant de comparer leur contenu.

Pour une chaîne terminée par un nul, strcmp respecte la fin du texte ; memcmp peut comparer des octets situés après. Ne lis pas ces octets sans avoir établi qu'ils appartiennent aux objets et sont initialisés.

Une structure peut contenir des octets de bourrage. L'égalité de ses champs n'implique donc pas l'égalité de toute sa représentation. Compare les champs qui définissent ton contrat.

Cette fonction ne garantit pas une durée indépendante des données. Elle ne convient pas à une comparaison cryptographique exigeant cette propriété.

Exemple

Les zones diffèrent seulement après leur octet nul. La condition affiche 1, car le premier buffer vient avant le second.

manual.c
#include <stdio.h>#include <string.h>
int main(void){    const unsigned char a[] = {65, 0, 88};    const unsigned char b[] = {65, 0, 89};    printf("%d\n", memcmp(a, b, sizeof a) < 0);    return 0;}
Terminal
$ gcc -std=c17 -Wall -Wextra -Werror manual.c -o manual$ ./manual1
C

memcmp

32-bit

Écris gm_memcmp en comparant les octets comme des unsigned char, sans arrêter le parcours au nul.

Ouvrir l’exercice

À toi d'écrire le code.