Memcmp C Implementation – N’importe quelle erreur logique avec celle-ci

Memcmp C Implementation – Des erreurs logiques avec celui-ci?

Je cherchais une implémentation de memcmp (), j’ai trouvé cet extrait de code, mais il est clairement indiqué qu’il existe une erreur logique avec l’extrait de code. Pourriez-vous m’aider à trouver l’erreur logique.

En gros, j’ai testé ce code avec l’implémentation de la bibliothèque ssortingng.h de memcmp () avec différentes entrées, mais le résultat attendu est toujours identique à la version de la bibliothèque de la fonction.

Voici l’extrait de code:

#include  #include  int memcmp_test(const char *cs, const char *ct, size_t n) { size_t i; for (i = 0; i < n; i++, cs++, ct++) { if (*cs  *ct) { return 1; } else { return 0; } } } int main() { int ret_val = 20; //initialize with non-zero value char *ssortingng1 = "china"; char *ssortingng2 = "korea"; ret_val = memcmp_test(ssortingng1,ssortingng2,5); printf ("ret_val is = %d",ret_val); getchar(); return 0; } 

J’ai exécuté le programme avec les deux exemples de chaînes et le programme reviendrait juste après la comparaison des premiers caractères des deux chaînes. ret_val est -1 dans le cas ci-dessus.

La définition de memcmp () à laquelle l’extrait de code ci-dessus doit être conforme est la suivante:

La définition de la fonction ‘C’ Library memcmp est int memcmp (const char * cs, const char * ct, size_t n)

Comparez les n premiers caractères de cs avec les n premiers caractères de ct. Retourne <0 si cs 0 si cs> ct. Renvoie 0 si cs == ct.

Il y a certainement une erreur logique, pourriez-vous m’aider à la trouver.

Comme il est écrit maintenant, ce code ne testera que le premier octet des entrées. Le else return 0 doit être sorti de la boucle, laissant le return 0 à la fin:

  for (i = 0; i < n; i++, cs++, ct++) { if (*cs < *ct) { return -1; } else if (*cs > *ct) { return 1; } } return 0; } 

Je suppose que puisque la signature de caractère est définie par l’implémentation, vous pouvez faire votre comparaison unsigned :

 int memcmp_test(const char *cs_in, const char *ct_in, size_t n) { size_t i; const unsigned char * cs = (const unsigned char*) cs_in; const unsigned char * ct = (const unsigned char*) ct_in; for (i = 0; i < n; i++, cs++, ct++) { if (*cs < *ct) { return -1; } else if (*cs > *ct) { return 1; } } return 0; } 

Regardez votre boucle. Il examine seulement un personnage.

Ssortingctement parlant, la signature est fausse. Le bon est:

 int memcmp(const void *s1, const void *s2, size_t n); 

Votre code compare c et k et, en constatant que c est inférieur à k renvoie consciencieusement a -1. Toutefois, si ces deux valeurs sont égales, vous obtiendrez un résultat incorrect, car vous revenez plus tôt.

Si vous lisez la documentation, vous trouverez:

Le signe d’une valeur de retour non nulle doit être déterminé par le signe de la différence entre les valeurs de la première paire d’octets (interprétés toutes les deux comme des caractères de type unsigned) qui diffèrent par les objects comparés.

Ce qui signifie fondamentalement que vous agissez correctement en retournant quelque chose qui préserve le signe de ('c' - 'k') .

Une implémentation plus simple peut être trouvée ici .

Le retour 0; se produit après avoir comparé uniquement le premier caractère. Il devrait être placé en dehors de la boucle.

Cet extrait fonctionne parfaitement pour moi!

 #include  #include  int memcmp_test(const char *cs, const char *ct, size_t n) { size_t i; for (i = 0; i < n; i++, cs++, ct++) { if (*cs < *ct) { return -1; } else if (*cs > *ct) { return 1; } } return 0; } int main() { int ret_val = 20; //initialize with non-zero value const char *ssortingng1 = "DWgaOtP12df0"; const char *ssortingng2 = "DWGAOTP12DF0"; ret_val = memcmp_test(ssortingng1,ssortingng2,5); printf ("ret_val is = %d",ret_val); getchar(); return 0; }