Fecha actual Dom Ago 18, 2019 9:53 am

Comparación y Longitud de Cadenas ASCIIZ de 8 Bits

Se centran en documentar algoritmos que no son intrínsecamente independientes de uno o más lenguajes, plataformas de hardware o situaciones particulares; pero desde el punto de vista de la implementación. Y no solo eso, sino que implementaciones en varios lenguajes, tantos como en los que sea útil en la práctica y que permita consolidar una funcionalidad y mayor potencial para el desarrollador, sea que trabaje en uno u otro lenguaje o entorno de desarrollo.


Usuarios leyendo este tema: Ninguno

Comparación y Longitud de Cadenas ASCIIZ de 8 Bits

Notapor ~ » Mar Nov 13, 2012 9:20 pm

A continuación tengo dos funciones escritas en ANSI C, que representan los equivalentes exactos de las funciones de la librería <string.h>, strcmp y strlen, totalmente escritas por mí.

Código: Seleccionar todo
int strcmp_own(const char *str1, const char *str2)
{
 register int expr=0;


 //Por ahora simplemente nos aseguramos de que ninguna
 //cadena haya llegado a su ASCIIZ final:
 ///
  while(*str1 && *str2)
  {
   //Aquí simplemente detectamos si el carácter actual
   //de las dos cadenas es diferente. Solo si hay una diferencia
   //nos molestamos en llevar a cabo la "pesada" tarea de
   //calcular y forzar el tipo adecuado de datos para la resta
   //y la devolvemos, ya que una diferencia en las cadenas nos dice
   //de inmediato matemáticamente cuál cadena es superior o inferior.
   //
   //Gracias a esto nos limitamos a ejecutar un máximo de 1 vez
   //dicha operación de forzado de tipos (type cast) y de resta a devolver
   //en toda la llamada de la función, en lugar de cada vez que
   //este bucle corra por cada carácter a comprobar, incondicionalmente.
   ///
    if(*str1!=*str2)break;


   //Solo si no hubo diferencia, entonces nos molestamos
   //en incrementar los punteros de las cadenas:
   ///
    str1++;str2++;
  }

 //Aquí repetimos el return anterior
 //para evitar usar más IFs, y simplemente,
 //sabiendo que en este punto una de las cadenas pudo
 //haber llegado a su final, o que ambas son idénticas,
 //llevamos a cabo este mismo return idéntico al anterior
 //para simplemente reintentar devolver esta condición
 //y al mismo tiempo cumplir con nuestro objetivo de minimizar
 //la cantidad de operaciones que se nos requirió ejecutar.
 ///
  return (unsigned char)*str1-(unsigned char)*str2;


 //Si deseamos devolver un resultado idéntico al que
 //devuelve GCC 4.x (siempre -1, 0 o 1), simplemente eliminamos
 //la línea de return anterior y dejamos que se ejecuten
 //las siguientes líneas:
 ///
  //expr=(unsigned char)*str1-(unsigned char)*str2;
  //if(expr<0)return -1;
  //if(expr>0)return 1;
  //return 0;
}





Código: Seleccionar todo
int strlen_own(unsigned const char *s)
{
 //Aquí simplemente avanzamos un puntero de cadena
 //mientras no apunte a un ASCIIZ,
 //y mientras tanto incrementamos un contador en 1.
 //
 //Entonces simplemente devolvemos este contador, el cual
 //representa la longitud de la cadena:
 ///
  register int x=0;
  while(*s++)x++;

 return x;
}


He tenido el cuidado de comprobar que de hecho el resultado devuelto por estas funciones es idéntico al de muchas versiones de las funciones equivalentes de la propia librería estándar de C.

La dirección actualizada y formal para este snippet, para el código anterior y para otros lenguajes de programación, es:

http://devel.no-ip.org/snippets/string_compare/
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Volver a Snippets

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados


cron