Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Miky Gonzalez en 4 Julio 2012, 11:46 am



Título: Ayuda - Ajustar tamaño array - variable
Publicado por: Miky Gonzalez en 4 Julio 2012, 11:46 am
Buenas, tengo el siguiente codigo:
Código
  1. char caracteres[39] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}, prueba[] = "HOLA MUNDO";
Como puedo hacer por ejemplo que al hacer:
Código
  1. strcpy(caracteres, prueba);
Se ajuste el tamaño de caracteres a 11 (caracteres[11]) para ahorrar la memoria de esas posiciones que ya no usare. Al hacer el strcpy me queda:
Código
  1. char caracteres[39] = {'H', 'O', 'L', 'A', ' ', 'M', 'U', 'N', 'D', 'O', '\n', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}
Como puedo eliminar lo anterior y ajustar el valor de caracteres[39] a caracteres[11] (se incluye el final de cadena).


Título: Re: Ayuda - Ajustar tamaño array - variable
Publicado por: DickGumshoe en 4 Julio 2012, 12:15 pm
A no ser que uses memoria dinámica, no va a poder ser...

Tendrías que declarar la variable "caracteres" como un puntero a char, reservarle memoria, y asignarle los valores que quieras, por ejemplo, las letras del abecedario, como en tu ejemplo.

Después, hallas la longitud de "prueba" con strlen(), y dejas a "caracteres" con esa longitud (usando la función realloc() ).

Finalmente, copias el contenido con strcpy.

Saludos.


Título: Re: Ayuda - Ajustar tamaño array - variable
Publicado por: Miky Gonzalez en 4 Julio 2012, 13:01 pm
A no ser que uses memoria dinámica, no va a poder ser...

Tendrías que declarar la variable "caracteres" como un puntero a char, reservarle memoria, y asignarle los valores que quieras, por ejemplo, las letras del abecedario, como en tu ejemplo.

Después, hallas la longitud de "prueba" con strlen(), y dejas a "caracteres" con esa longitud (usando la función realloc() ).

Finalmente, copias el contenido con strcpy.

Saludos.

Pero entonces, si yo por ejemplo: char caracteres[] = {'a' ..'z'}; le estoy dando el valor de 26. cuando copie con strcpy, me va a quedar tambien con 26 reservado aunque solo use por ejemplo 5, como haria para convertir ese 26 reservado en solo 5 por ejemplo? Si es posible algun ejemplo se agradeceria.


Título: Re: Ayuda - Ajustar tamaño array - variable
Publicado por: DickGumshoe en 4 Julio 2012, 13:16 pm
Te pongo un ejemplo para que lo entiendas mejor:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7.    char *cadena; //Puntero a char
  8.    char prueba[] = "Hola Mundo"; //Contenido que queremos poner en "cadena"
  9.    int i, longitud;
  10.    char letra = 'a'; //para asignarle valores a "cadena"
  11.  
  12.    cadena = (char*) malloc (27 * sizeof(char)); //Tenemos 27 espacios para la cadena.
  13.  
  14.    for(i=0; i<26; i++)
  15.    {
  16.        cadena[i] = letra;
  17.        letra++; //Pasamos a la siguiente letra del abecedario (valor en ASCII).
  18.    }
  19.    cadena[26] = '\0';
  20.  
  21.    //Ya tenemos asignados todos los valores de "cadena". Ahora, vamos a concatenar.
  22.  
  23.    longitud = strlen(prueba); //Hallamos la longitud para después quitar memoria
  24.  
  25.    cadena = (char*) realloc (cadena, (longitud + 1) * sizeof(char));  
  26.    //Sabemos que "prueba" tiene una longitud menor que "cadena". Por tanto, con realloc() se le quita memoria a "cadena",
  27.    //ya que no vamos a necesitar tanta. Se le reserva "longitud + 1" porque strlen() coge la longitud de la cadena sin
  28.    // el '\0' final.
  29.  
  30.    strcpy(cadena, prueba); //Concatenamos
  31.  
  32.    puts(cadena); //¡Ya tenemos "Hola Mundo en cadena!
  33.  
  34.    return 0;
  35.  
  36. }
  37.  
  38.  

Si tienes alguna duda sobre cómo utilizar realloc() u otra función, pregunta.

Saludos.


Título: Re: Ayuda - Ajustar tamaño array - variable
Publicado por: Miky Gonzalez en 4 Julio 2012, 13:19 pm
Vale ya entendi, muchas gracias DisckGumshoe por la ayuda.