Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: geeke en 15 Marzo 2015, 19:43 pm



Título: Comparación de dos cadenas sin usar ningún tipo de bucle
Publicado por: geeke en 15 Marzo 2015, 19:43 pm
Buenas, no estoy seguro si esto ya es conocido o no pero jugando con una implementación de strcmp descubrí que con solo comparar la dirección de inicio de dos cadenas se podía saber si eran iguales o no

Código
  1. #include <stdio.h>
  2.  
  3. int strcmp1(char *s, char *t)
  4. {
  5.    /*for(; *s==*t; s++, t++)
  6.     {
  7.         printf("s = %p, s = %c\n", s, *s);
  8.         printf("t = %p, t = %c\n", t, *t);
  9.  
  10.         if(*s=='\0')
  11.             return 0;
  12.     }*/
  13.    return s - t;
  14. }
  15.  
  16. int main(void)
  17. {
  18.    if(strcmp1("hola", "hola") == 0)
  19.        puts("Igual");
  20.    else
  21.        puts("Desigual");
  22.  
  23.    return 0;
  24. }
  25.  

Según veo con el depurador las direcciones de las cadenas son iguales sin ambas son iguales caso contrario son diferentes. Siendo sincero no entiendo porque pasa esto dos cadenas diferentes no deberían ocupar la misma dirección al mismo tiempo  :huh: ¿Alguien puede explicar que ocurre aquí?


Título: Re: Comparación de dos cadenas sin usar ningún tipo de bucle
Publicado por: rir3760 en 15 Marzo 2015, 20:12 pm
Aquí hay que tener presente la distinción entre contenedor (array) y contenido (cadena).

En el caso de las cadenas literales como "hola" estas se almacenan en un array anónimo (sin nombre) con el tamaño suficiente para cada uno de los caracteres indicados mas el terminador '\0', cadenas literales idénticas pueden almacenarse en arrays distintos o bien solo ser una referencia al (la dirección del) mismo array.

A ello se debe que la comparación "hola" == "hola" puede ser verdadera pero el estándar de C no lo garantiza.

Caso aparte si la cadena se almacena en un array declarado en el programa, en el bloque de memoria retornado por las funciones calloc, malloc o realloc o bien uno de los arrays estáticos parte de la biblioteca estándar de C. En todos esos casos las direcciones de memoria serán distintas sin importar el contenido.

Un saludo


Título: Re: Comparación de dos cadenas sin usar ningún tipo de bucle
Publicado por: kutcher en 15 Marzo 2015, 20:23 pm
¿Alguien puede explicar que ocurre aquí?

En realidad no funciona solo parece estar funcionado. La razón por la que esto sucede es probablemente debido a una optimización del compilador:  al tratar de reducir los requisitos de memoria ya que las dos cadenas literales son idénticas, por lo que el compilador genera sólo una instancia de ellos y utiliza ese mismo puntero cada vez que se hace referencia a la cadena literal.

Eso es lo que parece suceder en su caso pero el resultado puede variar de compilador a compilador. No se puede confiar en esto, también mencionar que si dejas que el usuario ingrese las cadenas no se almacenaran en la misma dirección, por lo tanto su método no devolverá cero.