• Jueves 2 de Mayo de 2024, 02:44

Autor Tema:  Conversión de un array de caracteres a un array de números  (Leído 2004 veces)

Manzanit0

  • Nuevo Miembro
  • *
  • Mensajes: 15
  • Nacionalidad: es
  • Sometimes we can’t feel the vibe of our heart...
    • Ver Perfil
    • Lapso de Imaginación
Conversión de un array de caracteres a un array de números
« en: Sábado 2 de Junio de 2012, 22:51 »
0
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
  1.     int *tonumber(char *cadena)
  2.     {
  3.       char letras[] = "ABCDFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  4.       int numeros[100], cadenafinal[100], i, j;
  5.      
  6.       for(i=0; i<25;i++) numeros[i] = i;
  7.       for(i=25; i<50;i++) numeros[i] = (i-25);
  8.      
  9.       for(i=0; i<strlen(cadena); i++){
  10.          for(j=0; j<strlen(letras); j++){
  11.              if(cadena[i] == letras[j]) cadenafinal[i] = numeros[j];}}
  12.      
  13.       return *cadenafinal;
  14.      
  15.     }

 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
  1.     main()
  2.     {
  3.     int q[100];
  4.     char *clave = "cadenadecaracteres"
  5.      
  6.     q = tonumber(clave); // Convierto cada caracter a número
  7.      
  8.     while(q[i] != '\0'){printf("-%d-", q[i]); i++;} // Imprimo los caracteres convertidos a números
  9.     }

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

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:Conversión de un array de caracteres a un array de números
« Respuesta #1 en: Domingo 3 de Junio de 2012, 01:44 »
0
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: [Seleccionar]
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;

}

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

Manzanit0

  • Nuevo Miembro
  • *
  • Mensajes: 15
  • Nacionalidad: es
  • Sometimes we can’t feel the vibe of our heart...
    • Ver Perfil
    • Lapso de Imaginación
Re:Conversión de un array de caracteres a un array de números
« Respuesta #2 en: Lunes 4 de Junio de 2012, 14:04 »
0
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
  1. char *cadena = "ABCD";

¿Qué significado tiene?

Por otra parte, te pongo dos versiones. ¿Son ambas correctas?

Versión sin punteros

Código: C
  1. void tonumber(char cadena[]) /*Versión sin punteros*/
  2. {
  3.   char letras[] = "ABCDFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  4.   int numeros[100], i, j;
  5.  
  6.   for(i=0; i<25;i++) numeros[i] = i;
  7.   for(i=25; i<50;i++) numeros[i] = (i-25);
  8.  
  9.   for(i=0; i<strlen(cadena); i++){
  10.      for(j=0; j<strlen(letras); j++){
  11.          if(cadena[i] == letras[j])
  12.             cadena[i] = numeros[j];}}
  13.  
  14. }

Versión con punteros:
Código: C
  1. int *tonumber(char *cadena) /*Versión con punteros*/
  2. {
  3.   char letras[] = "ABCDFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  4.   int numeros[100], i, j;
  5.   static int *cadenafinal;
  6.  
  7.   for(i=0; i<25;i++) numeros[i] = i;
  8.   for(i=25; i<50;i++) numeros[i] = (i-25);
  9.  
  10.   for(i=0; i<strlen(cadena); i++){
  11.      for(j=0; j<strlen(letras); j++){
  12.          if(cadena[i] == letras[j])
  13.             *(cadenafinal + i) = numeros[j];}}
  14.  
  15.   return *cadenafinal;
  16.  
  17. }

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:Conversión de un array de caracteres a un array de números
« Respuesta #3 en: Lunes 4 de Junio de 2012, 16:40 »
0
A raiz de lo que me comentas, ¿poner char *cadena, no es lo mismo que char cadena[]?

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: [Seleccionar]
    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;

Citar
Es decir, si yo declaro:

Código: C
  1. char *cadena = "ABCD";

¿Qué significado tiene?

Como dije antes, un apuntador a char

Citar
Por otra parte, te pongo dos versiones. ¿Son ambas correctas?

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: [Seleccionar]
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;

}

Saludos :)
« última modificación: Lunes 4 de Junio de 2012, 16:42 por ProfesorX »

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================