Ayuda - Ajustar tamaño array - variable

Iniciado por Miky Gonzalez, 4 Julio 2012, 11:46 AM

0 Miembros y 1 Visitante están viendo este tema.

Miky Gonzalez

Buenas, tengo el siguiente codigo:
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: 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: 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).
Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:

EN CONSTRUCCIÓN

DickGumshoe

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.

Miky Gonzalez

Cita de: 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.

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.
Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:

EN CONSTRUCCIÓN

DickGumshoe

#3
Te pongo un ejemplo para que lo entiendas mejor:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char *cadena; //Puntero a char
    char prueba[] = "Hola Mundo"; //Contenido que queremos poner en "cadena"
    int i, longitud;
    char letra = 'a'; //para asignarle valores a "cadena"

    cadena = (char*) malloc (27 * sizeof(char)); //Tenemos 27 espacios para la cadena.

    for(i=0; i<26; i++)
    {
        cadena[i] = letra;
        letra++; //Pasamos a la siguiente letra del abecedario (valor en ASCII).
    }
    cadena[26] = '\0';

    //Ya tenemos asignados todos los valores de "cadena". Ahora, vamos a concatenar.

    longitud = strlen(prueba); //Hallamos la longitud para después quitar memoria

    cadena = (char*) realloc (cadena, (longitud + 1) * sizeof(char)); 
    //Sabemos que "prueba" tiene una longitud menor que "cadena". Por tanto, con realloc() se le quita memoria a "cadena",
    //ya que no vamos a necesitar tanta. Se le reserva "longitud + 1" porque strlen() coge la longitud de la cadena sin
    // el '\0' final.

    strcpy(cadena, prueba); //Concatenamos

    puts(cadena); //¡Ya tenemos "Hola Mundo en cadena!

    return 0;

}



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

Saludos.

Miky Gonzalez

Vale ya entendi, muchas gracias DisckGumshoe por la ayuda.
Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:

EN CONSTRUCCIÓN