Escreva um programa para fazer a alocação dinâmica dos blocos de dados conforme solicitado abaixo:
Texto de até 100 linhas com até 80 caracteres em cada linha.

Passo 1

Resumo do problema: precisamos ler até 100 linhas de texto, cada uma com até 80 caracteres, e armazená-las dinamicamente de forma que cada linha ocupe exatamente a memória necessária.

Passo 2

Para organizar as linhas, vamos criar um vetor de ponteiros para char (char **). Esse vetor terá capacidade para 100 ponteiros, alocado dinamicamente com malloc.
Em seguida, fazemos um loop de leitura usando fgets em um buffer temporário de tamanho 81 (80 caracteres + ‘\0’). Para cada linha lida, calculamos seu comprimento real (removendo o ‘\n’ final se presente) e alocamos um bloco de memória de tamanho (len+1) para armazenar só os caracteres úteis.
Depois de alocar o espaço exato, usamos strcpy para copiar do buffer temporário para o bloco recém-alocado. Continuamos até esgotar as linhas ou atingir 100.

Passo 3

Por fim, após o processamento (seja impressão, análise ou outra operação), devemos liberar cada bloco alocado e também o vetor de ponteiros para evitar vazamento de memória.

Resposta

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINES 100
#define MAX_LEN 80
int main(void) {
char **lines = malloc(MAX_LINES * sizeof(char *));
if (!lines) {
perror(“Falha ao alocar vetor de ponteiros”);
return EXIT_FAILURE;
}
char buffer[MAX_LEN + 2]; // +1 para '\n' e +1 para '\0'
int count = 0;

while (count < MAX_LINES && fgets(buffer, sizeof(buffer), stdin)) {
    size_t len = strlen(buffer);
    if (len > 0 && buffer[len - 1] == '\n') {
        buffer[--len] = '\0';
    }

    lines[count] = malloc((len + 1) * sizeof(char));
    if (!lines[count]) {
        perror("Falha ao alocar linha");
        // liberar o que já foi alocado antes de sair
        for (int i = 0; i < count; i++) {
            free(lines[i]);
        }
        free(lines);
        return EXIT_FAILURE;
    }

    strcpy(lines[count], buffer);
    count++;
}

// Aqui você pode processar ou imprimir as linhas armazenadas
// Exemplo de impressão:
for (int i = 0; i < count; i++) {
    printf("Linha %d: %s\n", i + 1, lines[i]);
}

// Libera toda a memória alocada
for (int i = 0; i < count; i++) {
    free(lines[i]);
}
free(lines);

return 0;
}

Exercícios relacionados