Implementación de memcmp C – cualquier error lógico con este

Implementación de memcmp C – ¿Algún error lógico con este?

Estaba buscando una implementación de memcmp (), encontré este fragmento de código, pero está claramente marcado que hay 1 error lógico con el fragmento de código. ¿Podrías ayudarme a encontrar el error lógico?

Básicamente, probé este código en comparación con la implementación de la biblioteca string.h de memcmp () con diferentes entradas, pero la salida esperada es siempre la misma que la versión de la biblioteca de la función.

Aquí está el fragmento de código:

#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 *string1 = "china"; char *string2 = "korea"; ret_val = memcmp_test(string1,string2,5); printf ("ret_val is = %d",ret_val); getchar(); return 0; } 

Ejecuté el progtwig con las dos cadenas de ejemplo y el progtwig volvería justo después de la comparación de los primeros caracteres de las dos cadenas. ret_val es -1 en el caso anterior.

La definición de memcmp () que debe cumplir el fragmento de código anterior es:

La definición de la función de biblioteca ‘C’ memcmp es int memcmp (const char * cs, const char * ct, size_t n)

Compara los primeros n caracteres de cs con los primeros n caracteres de ct. Devuelve <0 si cs 0 si cs> ct. Devuelve 0 si cs == ct.

Definitivamente hay un error lógico, ¿podría ayudarme a encontrarlo?

Como está escrito ahora, este código solo probará el primer byte de las entradas. El else return 0 debe moverse fuera del bucle, dejando el return 0 al final:

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

Supongo que dado que la firma está definida por la implementación, puede hacer que su comparación unsigned esté 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; } 

Mira tu for loop. Solo está examinando un personaje.

Estrictamente hablando la firma es incorrecta. El correcto es:

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

Su código compara c y k y al encontrar que c es menor que k devuelve a -1. Sin embargo, si estos dos fueran iguales, obtendrías un resultado incorrecto ya que regresas temprano.

Si lees la documentación encontrarás:

El signo de un valor de retorno que no sea cero se determinará por el signo de la diferencia entre los valores del primer par de bytes (ambos interpretados como tipo sin signo) que difieren en los objetos que se comparan

Lo que básicamente significa que estás haciendo lo correcto al devolver algo que conserva el signo de ('c' - 'k') .

Una implementación más simple se puede encontrar aquí .

El retorno 0; Ocurre solo después de comparar el primer carácter. Debe colocarse fuera del bucle.

¡Este fragmento funciona perfecto para mí!

 #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 *string1 = "DWgaOtP12df0"; const char *string2 = "DWGAOTP12DF0"; ret_val = memcmp_test(string1,string2,5); printf ("ret_val is = %d",ret_val); getchar(); return 0; }