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>
#include <stdlib.h>
int main() {
int *vetor = NULL; // ponteiro para o vetor dinâmico
int contador = 0; // quantos elementos já temos
int valor;
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;
}