Construtor de Strings Dinâmico
Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 59 de 61.
Desafio
FácilVamos criar um StringBuilder: um contêiner de strings dinâmico que cresce automaticamente à medida que você adiciona texto. Este é um utilitário prático que combina gerenciamento de memória dinâmica com os padrões de OOP que você dominou ao longo deste curso.
Você organizará seu código em três arquivos:
stringbuilder.h: Declare a structStringBuildercom três membros: um bufferchar*, umsize_tpara o comprimento atual e umsize_tpara a capacidade total. Declare os protótipos de função para criar um StringBuilder, adicionar texto a ele, obter a string final e liberar a memória. As proteções contra inclusões múltiplas são essenciais.stringbuilder.c: Implemente seu sistema StringBuilder:create_stringbuilder: aloca um StringBuilder no heap, inicializa o buffer com uma capacidade inicial de 16 bytes, define o comprimento como 0 e garante que o buffer comece como uma string vazia (terminada em nulo)append: recebe um ponteiro para um StringBuilder e uma string para adicionar. Calcule o novo comprimento necessário. Se ele exceder a capacidade, dobre a capacidade (repetidamente, se necessário) e usereallocpara aumentar o buffer. Em seguida, concatene o novo texto usandostrcatget_string: retorna um ponteiro para o buffer interno (acesso somente para leitura)free_stringbuilder: libera primeiro o buffer e, em seguida, a própria struct StringBuilder
main.c: Leia um inteiro indicando quantas strings serão adicionadas. Em seguida, leia cada string usandofgetse adicione-a ao seu StringBuilder. Depois que todas as strings forem adicionadas, imprima a string completa montada usandoget_string. Por fim, libere o StringBuilder.
Duas funções importantes usadas neste desafio:
realloc(ptr, new_size): redimensiona um bloco de memória alocado anteriormente. Ela recebe um ponteiro para o bloco existente e o novo tamanho desejado em bytes, e retorna um ponteiro para o bloco redimensionado (que pode ter sido movido). Use-a emappendquando o buffer precisar crescer:sb->buffer = (char*)realloc(sb->buffer, sb->capacity);fgets(buffer, size, stream): lê uma linha de texto de um fluxo de entrada para um array de caracteres, parando em uma nova linha ou quandosize - 1caracteres tiverem sido lidos. Ela mantém o caractere de nova linha no buffer, portanto você precisará removê-lo manualmente. Use-a emmain.cpara ler cada string de entrada:fgets(line, sizeof(line), stdin);
Para remover a nova linha ao final: verifique se o último caractere é'\n'e substitua-o por'\0'.
Seu programa receberá:
- O número de strings a serem adicionadas
- Cada string em uma linha separada
Exemplo de saída quando as entradas são 3, depois Hello, , World:
Hello WorldExemplo de saída quando as entradas são 4, depois C, is, a, great language!:
C is a great language!Exemplo de saída quando a entrada é 1, depois SingleString:
SingleStringLembre-se de atualizar o campo length após cada operação de adição. Ao verificar se a realocação é necessária, leve em conta o terminador nulo: o buffer precisa de espaço para length + new_text_length + 1 bytes. Use strlen de <string.h> para medir os comprimentos das strings. Também chame getchar() depois de scanf em main.c para consumir a nova linha restante antes de ler as strings com fgets.
Experimente você mesmo
#include <stdio.h>
#include <stdlib.h>
#include "stringbuilder.h"
int main() {
int n;
scanf("%d", &n);
getchar(); // consome a nova linha após o número
// TODO: Create a StringBuilder using create_stringbuilder()
// TODO: Read n strings and append each to the StringBuilder
// Dica: Use fgets ou similar para ler cada linha
// Lembre-se de tratar o caractere de nova linha do fgets se você usá-lo
// TODO: Imprima a string completa montada usando get_string()
// TODO: Free the StringBuilder using free_stringbuilder()
return 0;
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos da Programação Modular
Arquivos de CabeçalhoInclude GuardsArquivos-FonteFunções EstáticasRecapitulação: Calculadora Modular4Encapsulamento
Conceito de Ponteiros OpacosDefinindo Structs OpacasGetters e SettersValidação em SettersRecapitulação: Caixa Secreta2Objetos e Métodos
Structs como ObjetosO Ponteiro 'Self'Const CorrectnessPonteiro vs ValorMétodos AuxiliaresRecapitulação: Point Manager5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de Vida de Objetos
Padrão de ConstrutorPadrão de DestrutorInicialização na StackCópia ProfundaRecapitulação: String Wrapper6Herança via Composição
Incorporação de StructsA Regra do Primeiro MembroAcessando Membros PaiUpcastingRecapitulação: Hierarquia de Formas9Projeto: Desenhador de Formas
Visão Geral do ProjetoImplementação do CírculoImplementação do RetânguloUso PolimórficoContainer de FormasPratique por conta própria: Compilador de C online