Programación General > C/C++
Conversión de un array de caracteres a un array de números
(1/1)
Manzanit0:
El caso es que ahora me ha surgido un problema a mi, y llevo luchando con el al menos dos horas. Estoy intentando convertir un carácter a un número. He diseñado la siguiente función:
--- Código: C --- int *tonumber(char *cadena) { char letras[] = "ABCDFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; int numeros[100], cadenafinal[100], i, j; for(i=0; i<25;i++) numeros[i] = i; for(i=25; i<50;i++) numeros[i] = (i-25); for(i=0; i<strlen(cadena); i++){ for(j=0; j<strlen(letras); j++){ if(cadena[i] == letras[j]) cadenafinal[i] = numeros[j];}} return *cadenafinal; }
El problema es que posteriormente, en el uso no salen resultados. No sé si es por que estoy usando mal los punteros (al retornar un int *) o si se me escapa cualquier otra cosa.
--- Código: C --- main() { int q[100]; char *clave = "cadenadecaracteres" q = tonumber(clave); // Convierto cada caracter a número while(q[i] != '\0'){printf("-%d-", q[i]); i++;} // Imprimo los caracteres convertidos a números }
Agradecería verdaderamente ayuda cuanto antes. Llevo más de la mitad del programa diseñado. Diseñé un buen algoritmo de encriptación y más o menos no va mal, el problema es este. :ayuda:
ProfesorX:
Bueno aqui tienes un error muy comun a los que comienzan a trabajar con punteros, y es regresar un puntero a una variable local (en este caso un puntero a cadenafinal).
Ten en cuenta que las variables locales y por lo tanto su direccion, solo son validas dentro de la funcion, una vez saliendo de la funcion, esa variable se destruye, y su contenido ya no es valido, es por eso que return *cadenafinal; no te regresa al valor correcto.
Tienes dos opciones, que utilices memoria dinamica y reserva memoria con malloc dentro de la funcion, para que el valor se conserve, o mejor, no te compliques tanto y tan solo pasa como parametro tu arreglo(vector), y guardas el resultado ahi, sin usar punteros, te dejo el codigo de la segunda opcion para que te des una idea:
--- Código: ---void tonumber(char cadena[], int cadenafinal[])
{
char letras[] = "ABCDFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
int numeros[100];//, cadenafinal[100];
unsigned int i, j;
for(i=0; i<25; i++) numeros[i] = i;
for(i=25; i<50; i++) numeros[i] = (i-25);
for(i=0; i<strlen(cadena); i++)
{
for(j=0; j<strlen(letras); j++)
{
if(cadena[i] == letras[j]) cadenafinal[i] = numeros[j];
}
}
//return cadenafinal;
}
--- Fin del código ---
Saludos :)
Manzanit0:
A raiz de lo que me comentas, ¿poner char *cadena, no es lo mismo que char cadena[]?
Es decir, si yo declaro:
--- Código: C ---char *cadena = "ABCD";
¿Qué significado tiene?
Por otra parte, te pongo dos versiones. ¿Son ambas correctas?
Versión sin punteros
--- Código: C ---void tonumber(char cadena[]) /*Versión sin punteros*/{ char letras[] = "ABCDFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; int numeros[100], i, j; for(i=0; i<25;i++) numeros[i] = i; for(i=25; i<50;i++) numeros[i] = (i-25); for(i=0; i<strlen(cadena); i++){ for(j=0; j<strlen(letras); j++){ if(cadena[i] == letras[j]) cadena[i] = numeros[j];}} }
Versión con punteros:
--- Código: C ---int *tonumber(char *cadena) /*Versión con punteros*/{ char letras[] = "ABCDFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; int numeros[100], i, j; static int *cadenafinal; for(i=0; i<25;i++) numeros[i] = i; for(i=25; i<50;i++) numeros[i] = (i-25); for(i=0; i<strlen(cadena); i++){ for(j=0; j<strlen(letras); j++){ if(cadena[i] == letras[j]) *(cadenafinal + i) = numeros[j];}} return *cadenafinal; }
ProfesorX:
--- Cita de: Manzanit0 en Lunes 4 de Junio de 2012, 14:04 ---A raiz de lo que me comentas, ¿poner char *cadena, no es lo mismo que char cadena[]?
--- Fin de la cita ---
No, no es lo mismo. char cadena* es un apuntador a caracteres, mientras que char cadena[] es un arreglo de caracteres, en el primer caso, es una variable que apunta a una direccion de memoria, no reserva espacio ni nada, su funcion es solo apuntar valga la redundancia, mientras que char cadena[] reserva espacio en memoria para guardar el arreglo. A veces existe la confusion de que son lo mismo debido a que en algunos casos puedes usar el apuntador como si fuera un arreglo y viceversa, pero hay que tener en cuenta el significado de cada uno.
Te dejo un ejemplo que te lo aclara mejor:
--- Código: --- char *clave1 = "abcd";
char clave2[] = "fgh";
// El siguiente codigo no marcara error, ya que clave1 es un apuntador a char
// asi que puede apuntar a cualquier variable de tipo char
clave1 = clave2;
// El siguiente codigo marcara error de compilacion, pues clave2 no es un
// apuntador a char, por lo tanto solo puede contener la direccion de la
// cadena originalmente asignada "fgh"
clave2 = clave1;
--- Fin del código ---
--- Citar ---Es decir, si yo declaro:
--- Código: C ---char *cadena = "ABCD";
¿Qué significado tiene?
--- Fin de la cita ---
Como dije antes, un apuntador a char
--- Citar ---Por otra parte, te pongo dos versiones. ¿Son ambas correctas?
--- Fin de la cita ---
Bueno, veo que modificaste la version con punteros para hacer la variable cadenafinal estatica, en este caso al ser estatica no se elimina al salir de la fiuncion, y aunque funciona, aun asi me parece peligroso, tienes el problema que te dije en mi mensaje anterior, estas accediendo a una variable que es local a la funcion tonumber por medio de un apuntador desde fuera de la funcion, en un codigo grande es facil perder a donde esta apuntando la variable, en mi parecer como te dije antes seria mucho mejor asignar espacio para cadenafinal desde afuera de la funcion y pasarle como parametro el arreglo.
Aunque tienes un error, estas regresando el valor, en lugar de la direccion, lo correcto es:
--- Código: ---int *tonumber(char *cadena) /*Versión con punteros*/
{
char letras[] = "ABCDFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
int numeros[100], i, j;
static int *cadenafinal;
for(i=0; i<25;i++) numeros[i] = i;
for(i=25; i<50;i++) numeros[i] = (i-25);
for(i=0; i<strlen(cadena); i++){
for(j=0; j<strlen(letras); j++){
if(cadena[i] == letras[j])
*(cadenafinal + i) = numeros[j];}}
// Regresa la direccion, no el valor
return cadenafinal;
}
--- Fin del código ---
Saludos :)
Navegación
Ir a la versión completa