Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Cadenas diferentes pero me las toma como iguales

Estas en el tema de Cadenas diferentes pero me las toma como iguales en el foro de C/C++ en Foros del Web. Hola forer@s, les traigo una inquietud que estoy teniendo. Hace un par de semanas me incursioné en C con una idea media tonta pero como ...
  #1 (permalink)  
Antiguo 26/01/2011, 07:22
Avatar de Payin  
Fecha de Ingreso: mayo-2007
Mensajes: 92
Antigüedad: 16 años, 11 meses
Puntos: 0
Cadenas diferentes pero me las toma como iguales

Hola forer@s, les traigo una inquietud que estoy teniendo. Hace un par de semanas me incursioné en C con una idea media tonta pero como para comenzar, el tema es que quiero hacer el Hash de dos cadenas de caracteres y compararlas, si dan iguales poner algo y sino otra cosa. Luego este pedazo de codigo lo utilizaré en una funcion de otro programa. Me gustaría saber porqué en este código cuando lo ejecuto siempre me da que son cadenas iguales (las ya hasheadas)

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(void)
{		
 	char original[512];
    	char *clave;
	char *clave2;
	int ok;
	//para que sea MD5 SALT debe comenzar con $1$
	const char *const salt = "$1$";
    	printf("Ingrese el texto a encriptar \n");
	fgets(original, sizeof(original), stdin);
	original[strlen(original) - 1] = '\0';	
	clave = crypt(original, salt);
	puts(clave);
	printf("Ingrese el texto a comparar \n");
	fgets(original, sizeof(original), stdin);
	original[strlen(original) - 1] = '\0';	
	clave2 = crypt(original, salt);
	puts(clave2);
	ok = strcmp(clave,clave2)==0;
	puts(ok ? "Claves Iguales" : "Claves diferentes");
	return ok ? 0 : 1;
}
cuando lo compilo (con el gcc) me da esto

Código:
encriptar.c:18: warning: assignment makes pointer from integer without a cast
encriptar.c:23: warning: assignment makes pointer from integer without a cast
si bien he buscado e intentado cambiarlo no se qué problema tienen esas dos asignaciones (clave y clave2).
Muchas gracias y saludos
  #2 (permalink)  
Antiguo 26/01/2011, 11:44
Avatar de Munire  
Fecha de Ingreso: julio-2010
Ubicación: en el ciberdespacio (España)
Mensajes: 150
Antigüedad: 13 años, 9 meses
Puntos: 4
Respuesta: Cadenas diferentes pero me las toma como iguales

clave y clave2 son punteros

si le haces una asignacion asi

clave = (aqui tiene que ir una direccion de memoria);
clave2 = (aqui tiene que ir una direccion de memoria);

por lo que

clave = crypt(original, salt);

la funcion crypt debe devolver un puntero
  #3 (permalink)  
Antiguo 26/01/2011, 20:42
Avatar de Payin  
Fecha de Ingreso: mayo-2007
Mensajes: 92
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Cadenas diferentes pero me las toma como iguales

Gracias pro tu respuesta, pero no entiendo porque el warning ya que la funcion crypt da un puntero, esto dice el manual de la funcion

A pointer to the encrypted password is returned. On error, NULL is returned.

El problema de las cadenas iguales segun el strcmp es por este tema de los punteros? He estado leyendo, pero se ve que no me alcanza todavia
  #4 (permalink)  
Antiguo 27/01/2011, 03:52
Avatar de Munire  
Fecha de Ingreso: julio-2010
Ubicación: en el ciberdespacio (España)
Mensajes: 150
Antigüedad: 13 años, 9 meses
Puntos: 4
Respuesta: Cadenas diferentes pero me las toma como iguales

creo que ya se lo que pasa. la funcion devuelve un puntero a un entero int y lo estas asignando a un puntero a char. prueba cambiando esto en las declaraciones:

int *clave;
int *clave2;
  #5 (permalink)  
Antiguo 27/01/2011, 08:55
Avatar de Payin  
Fecha de Ingreso: mayo-2007
Mensajes: 92
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Cadenas diferentes pero me las toma como iguales

Probé cambiarlo, pero tampoco me dio resultados, es más, tuve muchos warnings por pasar de int a char. Segun la descripcion de la funcion crypt ésta debería de devolver un puntero char, dice esto:

char *crypt(const char *key, const char *salt);

Hoy seguiré leyendo a ver si el problema está en cómo manejo los punteros. Muchas gracias por la respuesta :)

--- edit --

Les quité los warnings, haciendo

*clave = crypt(original, salt);

pero ahora no me encripta bien como me encriptaba antes. En realidad ahora no sé que me está retornando en la variable clave, porque cuando lo imprimo solo me pone 'P'

Última edición por Payin; 27/01/2011 a las 09:31
  #6 (permalink)  
Antiguo 27/01/2011, 09:37
Avatar de Munire  
Fecha de Ingreso: julio-2010
Ubicación: en el ciberdespacio (España)
Mensajes: 150
Antigüedad: 13 años, 9 meses
Puntos: 4
Respuesta: Cadenas diferentes pero me las toma como iguales

*clave = crypt(original, salt);

esto esta mal por que estas escribiendo lo que devuelve la funcion donde apunta el puntero clave. y clave no apunta a nada (valor basura) por lo que el resultado es impredecible.

si pones el codigo entero igual te puedo ayudar mejor
  #7 (permalink)  
Antiguo 27/01/2011, 09:55
Avatar de Payin  
Fecha de Ingreso: mayo-2007
Mensajes: 92
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Cadenas diferentes pero me las toma como iguales

Sigo con el código exactamente como lo puse la primera vez, no quise agregarle mas funciones, si lo primordial no lo puedo hacer. Cada cosa que pruebo no resulta como lo pensaba, asi que sigo estancado en el mismo lugar.
Ahi entendi lo del valor de memoria, y era obvio que me iban a dar iguales ya que apuntan a la nada. Gracias.

Creo que el problema reside en cómo trato las cadenas y los punteros, pero sin descifrarlo.
  #8 (permalink)  
Antiguo 28/01/2011, 11:51
 
Fecha de Ingreso: octubre-2010
Ubicación: Edo. de México
Mensajes: 94
Antigüedad: 13 años, 6 meses
Puntos: 9
Respuesta: Cadenas diferentes pero me las toma como iguales

Bueno estaba esperando que alguien mas contestara pero ahi te va.

La funcion crypt efectivamente te devuelve un puntero a una cadena, pero que putero?, digamos que en ningun momento le dijimos en que puntero queriamos almacenar el resultado ni nada, entonces no tenemos el control de que puntero nos devuelve, simplemente nos devuelve uno. Entonce este es un puntero local a esa función, esto quiere decier, que cuando usas la funcion crypt, esta declara un puntero y lo mas probable es que lo declare en la primer localidad disponible que encuentre. Digamos que lo declara en la localidad 53F (por decir algo), entonces al momento de hacer su asignacion clave= crypt(...), clave obtiene como valor ese 53F O.o. PERO esa era memoria local, entonces lo que pasa es que esa memoria, al terminar la funcion crypt, vuelve a estar disponible para el sistema :o, y la segunda vez que corres crypt (sorpresa), si era memoria no se a ocupado en algun otro proceso, crypt vuelve a tomar esta localidad para depositar el resultado.

Para hacerlo un poco mas grafico digamos que yo hago algo asi.
-----------Antes del primer crypt--------------
LOCALIDAD DE MEMORIA 53F = Basura
clave = NULL (sin apuntador asociado)
clave2 = NULL
.................................................. ........................
clave = crypt(...)

---------Despues del primer crypt---------------
LOCALIDAD DE MEMORIA 53F = $1SOYUNHASH
clave = 53F
clave2 = NULL
-----------------------------------------------------------
clave2 = crypt(...)

----------Despues del segundo crypt------------------
LOCALIDAD DE MEMORIA 53F = $1SOYOTROHASH
clave = 53F
clave2 = 53F
------------------------------------------------------------------

Por lo que al hacer la comparacion, siempre (o casi siempre) te va a dar el mismo resultado. Para resolver esto lo que tienes que hacer es, en lugar de copiar el apuntador (clave = crypt()) es.

1. reservar memoria para clave y clave2 mediante malloc() o creando un arreglo de chars en lugar de un apuntador, y
2. copiar el contenido de crypt (el contenido dije) en tu clave y clave2, mediante un strcpy()

Asi veras que corre tu codigo perfectamente ^^

Espero haber sido de ayuda.
Saludos ++
  #9 (permalink)  
Antiguo 28/01/2011, 16:05
Avatar de Payin  
Fecha de Ingreso: mayo-2007
Mensajes: 92
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Cadenas diferentes pero me las toma como iguales

Muchas gracias, habia visto que al imprimir los lugares de memoria eran los mismos entre clave y clave2 pero no sabia cómo buscar para "quitarle" el valor a crypt, ya que pensaba (por la definicion del return de la funcion) que ya me estaba devolviendo una cadena de caracteres. Perdon por mi ignorancia, pero nunca habia trabajado con cosas asi me resulta muy extraña la forma en que se manejan los accesos a variables y memoria.
Muchisimas gracias a los dos =) en breve lo estaré probando, se me acaba de quemar la placa de video de mi pc de escritorio y no pude probar nada todavia :( el calor que está haciendo fue demasiado para mi pc de 8 años,

Buen fin de semana

Etiquetas: cadenas, diferentes, iguales
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:11.