elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Comparación de dos cadenas sin usar ningún tipo de bucle
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Comparación de dos cadenas sin usar ningún tipo de bucle  (Leído 1,923 veces)
geeke

Desconectado Desconectado

Mensajes: 93


Ver Perfil
Comparación de dos cadenas sin usar ningún tipo de bucle
« 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í?


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Comparación de dos cadenas sin usar ningún tipo de bucle
« Respuesta #1 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


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
kutcher

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Re: Comparación de dos cadenas sin usar ningún tipo de bucle
« Respuesta #2 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.
« Última modificación: 16 Marzo 2015, 02:25 am por kutcher » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Comparación de cadenas (string)
Programación Visual Basic
el_lichal 4 2,439 Último mensaje 17 Noviembre 2005, 18:40 pm
por el_lichal
comparacion de cadenas « 1 2 »
Programación C/C++
m@o_614 10 5,948 Último mensaje 19 Febrero 2012, 18:11 pm
por Sagrini
Comparacion BUCLE C vs QB64
Programación C/C++
pica6666 4 2,773 Último mensaje 18 Junio 2012, 18:40 pm
por pica6666
Comparación de cadenas « 1 2 »
Programación C/C++
kaostias 10 5,299 Último mensaje 24 Octubre 2013, 16:05 pm
por kaostias
Duda copia cadenas diferente tipo.
Programación C/C++
cartorami 4 2,315 Último mensaje 2 Septiembre 2016, 15:34 pm
por cartorami
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines