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

[0] Índice de Mensajes

Ir a la versión completa