Menu
Coddy logo textTech

Constructor de strings dinámico

Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 59 de 61.

challenge icon

Desafío

Fácil

Construyamos un StringBuilder: un contenedor de cadenas dinámico que crece automáticamente a medida que agregas texto. Esta es una utilidad práctica que combina la gestión dinámica de memoria con los patrones de POO que has dominado a lo largo de este curso.

Organizarás tu código en tres archivos:

  • stringbuilder.h: declara la estructura StringBuilder con tres miembros: un búfer char*, un size_t para la longitud actual y un size_t para la capacidad total. Declara los prototipos de las funciones para crear un StringBuilder, agregarle texto, obtener la cadena final y liberar la memoria. Las protecciones contra inclusiones múltiples son esenciales.
  • stringbuilder.c: implementa tu sistema StringBuilder:
    • create_stringbuilder: asigna un StringBuilder en el montón, inicializa el búfer con una capacidad inicial de 16 bytes, establece la longitud en 0 y garantiza que el búfer comience como una cadena vacía (terminada en nulo)
    • append: recibe un puntero a un StringBuilder y una cadena que se agregará. Calcula la nueva longitud requerida. Si supera la capacidad, duplica la capacidad (repetidamente si es necesario) y usa realloc para aumentar el búfer. Después concatena el nuevo texto usando strcat
    • get_string: devuelve un puntero al búfer interno (acceso de solo lectura)
    • free_stringbuilder: libera primero el búfer y después la propia estructura StringBuilder
  • main.c: lee un entero que indica cuántas cadenas se agregarán. Después lee cada cadena usando fgets y la agrega a tu StringBuilder. Después de agregar todas las cadenas, imprime la cadena completa ensamblada usando get_string. Finalmente, libera el StringBuilder.

Dos funciones clave utilizadas en este desafío:

  • realloc(ptr, new_size): cambia el tamaño de un bloque de memoria asignado previamente. Recibe un puntero al bloque existente y el nuevo tamaño deseado en bytes, y devuelve un puntero al bloque redimensionado (posiblemente movido). Úsala en append cuando el búfer necesite crecer:
    sb->buffer = (char*)realloc(sb->buffer, sb->capacity);
  • fgets(buffer, size, stream): lee una línea de texto de un flujo de entrada en un arreglo de caracteres, deteniéndose ante un salto de línea o cuando se hayan leído size - 1 caracteres. Conserva el carácter de salto de línea en el búfer, por lo que tendrás que eliminarlo manualmente. Úsala en main.c para leer cada cadena de entrada:
    fgets(line, sizeof(line), stdin);
    Para eliminar el salto de línea final: comprueba si el último carácter es '\n' y reemplázalo por '\0'.

Tu programa recibirá:

  1. La cantidad de cadenas que se agregarán
  2. Cada cadena en una línea separada

Ejemplo de salida cuando las entradas son 3, después Hello, , World:

Hello World

Ejemplo de salida cuando las entradas son 4, después C, is, a, great language!:

C is a great language!

Ejemplo de salida cuando la entrada es 1, después SingleString:

SingleString

Recuerda actualizar el campo length después de cada operación de agregado. Al comprobar si es necesario reasignar memoria, ten en cuenta el terminador nulo: el búfer necesita espacio para length + new_text_length + 1 bytes. Usa strlen de <string.h> para medir las longitudes de las cadenas. También llama a getchar() después de scanf en main.c para consumir el salto de línea restante antes de leer las cadenas con fgets.

Pruébalo tú mismo

#include <stdio.h>
#include <stdlib.h>
#include "stringbuilder.h"

int main() {
    int n;
    scanf("%d", &n);
    getchar(); // consumir el salto de línea después del número
    
    // TODO: Create a StringBuilder using create_stringbuilder()
    
    // TODO: Read n strings and append each to the StringBuilder
    // Pista: Usa fgets o similar para leer cada línea
    // Recuerda manejar el carácter de salto de línea de fgets si lo usas
    
    // TODO: Imprime la cadena completa ensamblada usando get_string()
    
    // TODO: Free the StringBuilder using free_stringbuilder()
    
    return 0;
}

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de C online