Faça um programa que leia uma quantidade qualquer de números armazenando-os na memória e pare a leitura quando o usuário entrar um número negativo. Em seguida, imprima o vetor lido. Use a função REALLOC.

Passo 1

O enunciado pede um programa em C que leia vários números inteiros até que o usuário digite um número negativo, armazene todos os números não-negativos num vetor de tamanho dinâmico (crescendo com realloc) e depois imprima esse vetor. Vamos usar alocação dinâmica para não precisar saber antecipadamente quantos números o usuário digitará.

Passo 2

Precisamos de um ponteiro para int que representará o vetor, de um contador para saber quantos elementos já guardamos e, opcionalmente, de uma variável para checar falha de alocação. Em C, podemos inicializar o ponteiro a NULL e usar realloc diretamente, pois realloc(NULL, tamanho) equivale a malloc(tamanho).

Passo 3

Na leitura dos números vamos usar um laço infinito. A cada iteração, lemos um valor em uma variável temporária. Se esse valor for negativo, interrompemos o laço. Caso contrário, reaplicamos realloc no ponteiro para aumentar o espaço em sizeof(int) bytes, armazenamos o novo valor na posição atual (índice igual ao contador) e incrementamos o contador.

Passo 4

Depois que sairmos do laço de leitura, teremos no nosso ponteiro um bloco contíguo de memória contendo exatamente ‘contador’ números lidos. Basta percorrê-los com um for de 0 até contador-1 e imprimir cada elemento.

Passo 5

Por fim, sempre liberamos a memória alocada com free e retornamos 0 em main para indicar execução bem-sucedida.

Resposta

#include <stdio.h>
#include <stdlib.h>
int main() {
int *vetor = NULL; // ponteiro para o vetor dinâmico
int contador = 0; // quantos elementos já temos
int valor;
while (1) {
    printf("Digite um número (negativo para parar): ");
    if (scanf("%d", &valor) != 1) {
        fprintf(stderr, "Erro na leitura.\n");
        free(vetor);
        return 1;
    }
    if (valor < 0) {
        break;
    }
    int *tmp = realloc(vetor, (contador + 1) * sizeof(int));
    if (tmp == NULL) {
        fprintf(stderr, "Falha na alocação de memória.\n");
        free(vetor);
        return 1;
    }
    vetor = tmp;
    vetor[contador] = valor;
    contador++;
}

printf("\nValores lidos (não-negativos):\n");
for (int i = 0; i < contador; i++) {
    printf("%d ", vetor[i]);
}
printf("\n");

free(vetor);
return 0;
}

Exercícios relacionados