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.
Desafío
FácilConstruyamos 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 estructuraStringBuildercon tres miembros: un búferchar*, unsize_tpara la longitud actual y unsize_tpara 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 usareallocpara aumentar el búfer. Después concatena el nuevo texto usandostrcatget_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 usandofgetsy la agrega a tu StringBuilder. Después de agregar todas las cadenas, imprime la cadena completa ensamblada usandoget_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 enappendcuando 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ídosize - 1caracteres. Conserva el carácter de salto de línea en el búfer, por lo que tendrás que eliminarlo manualmente. Úsala enmain.cpara 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á:
- La cantidad de cadenas que se agregarán
- Cada cadena en una línea separada
Ejemplo de salida cuando las entradas son 3, después Hello, , World:
Hello WorldEjemplo 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:
SingleStringRecuerda 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
1Fundamentos de programación modular
Archivos de cabeceraGuardas de inclusiónArchivos fuenteFunciones estáticasRepaso: Calculadora modular4Encapsulamiento
Concepto de punteros opacosDefinición de structs opacosGetters y SettersValidación en settersResumen: Caja secreta7Punteros a funciones
Declaración de punteros a funcionesLlamada a punteros a funcionesTypedef para punteros a funcionesPasar funciones como argumentosRepaso: Dispatch de calculadora10Contenedores genéricos
Repaso de punteros voidWrapper genéricoSwap genéricoComparación genéricaRepaso: Array genérico2Objetos y métodos
Structs como objetosEl puntero 'Self'Const CorrectnessPuntero vs. ValorMétodos auxiliaresResumen: Point Manager5Proyecto: Cuenta bancaria simple
Configuración del proyectoImplementación de la cuenta3Ciclo de vida de los objetos
Patrón ConstructorPatrón DestructorInicialización en StackCopia profundaResumen: String Wrapper6Herencia mediante composición
Incrustación de StructsLa regla del primer miembroAcceso a miembros padreUpcastingResumen: Jerarquía de formas9Proyecto: Dibujador de figuras
Descripción general del proyectoImplementación del círculoImplementación del rectánguloUso polimórficoContenedor de figurasPractica por tu cuenta: Compilador de C online