How to store vector values?

2

I am a beginner in C and I am 2 days into this exercise, I was able to do it so that if you increase the vector with the realloc function, it will increase everything right, but I need it to save the values you typed .

For example, I want a vector of 2 positions, and then I'm going to reallocate it with + 3 positions, it should not ask to insert all the values of the vector again, but to enable to insert values ONLY for these 3 new positions

How do I get it to save what was already stored in the vector first?

No I was able to leave stored the values that the user types the first time when the vector is allocated and then only fill by relocating the values of the NEW POSITIONS strong>, that is, letting the user fill in new values only in these new positions and MAINTAIN THE NUMBERS DIGITED ABOVE

#include <stdio.h>
#include <stdlib.h>



int main(void)
{
    int *p;
    int i,k,n;
    printf ("\nDigite a quantidade de numeros que serao digitados: ");
    fflush(stdin);
    scanf ("%d",&i); // a variavel i vai receber a quantidade de numeros que sera necessario para o vetor

    /* a função malloc reserva espaço suficiente para um vetor de inteiros.
    caso sejam digitados 5 elementos serão reservados 20 bytes, pois cada
    inteiro ocupa 4 bytes na memória */

    p=(int*)malloc(i*sizeof(int)); // Aloca um espaço de memoria para um vetor de inteiros
    if (p==NULL) // verifica se ha memoria disponivel ANTES de habilitar para preencher vetor
    {
        printf ("\nERRO.MEMORIA INSUFICIENTE");
        exit(1);
    }
    for (k=0;k<i;k++) // preenche o vetor
    {
        printf ("\nDigite o %d numero do vetor: ",k+1);
        fflush(stdin); //limpar buffer do teclado
        scanf ("%d",&p[k]);
    }
    printf ("\n\n\t\t========== VETOR PREENCHIDO ==========\n");
    for (k=0;k<i;k++) // Mostra vetor preenchido
    {
        printf ("\t\t%d",p[k]);
    }

      printf ("\n\nSeu vetor possui %d elementos.",i);
      printf ("\nDigite um valor positivo para aumentar ao vetor.");
      printf ("\n\n");
      fflush(stdin);
      scanf ("%d",&n); // n vai receber a quantidade de posicoes que tera de ser realocado o vetor para inserção de novos numeros

      if ((i+n)<0) // Testa para ver se o usuario vai digitar um valor positivo para aumentar o vetor dinamicamente
      {
          printf ("\nSeu vetor possui quantidade negativa de elemento.\n\nIMPOSSIVEL ALOCAR MEMORIA.\n\n");
          free(p);
          return 0;
          system("pause");
      }

      /* a função realloc aumenta (numero positivo) ou diminui (numero negativo), o tamanho do
      vetor dinamicamente. ela recebe o ponteiro para o vetor anterior e retorna o novo espaço alocado */

      p=(int*)(realloc(p,(i+n)*sizeof(int))); // REaloca um espaço de memoria para a quantidade informada
      if (p==NULL) //Testa novamente mas agora para saber se ha espaço disponivel para a REalocacao
      {
          printf ("\nERRO DE REALOCACAO.MEMORIA INSUFICIENTE");
          exit(1);
      }
      for (k=0;k<(n+i);k++) // Aceita preencher com os novos valores do vetor aumentado dinamicamente
      {
          printf ("\nDigite o %d numero do vetor: ",k+1);
          fflush(stdin);
          scanf ("%d",&p[k]);
      }
      printf ("\n\n\t\t========== VETOR PREENCHIDO REALOCADO ==========\n");
      for (k=0;k<(n+i);k++) // Mostra vetor REalocado
      {
           printf ("\t\t%d",p[k]);
      }
      free(p); // Libera o espaço de memoria que utilizamos
      return 0;
      system("pause");
  }
    
asked by anonymous 25.06.2017 / 14:13

1 answer

2

I've improved the legibility of the code and updated it, but the error is just about getting the positions of the new array. It is starting at position 0 that has already been filled, has to start from where it stopped in the old one, since the new one has 5 positions has to fill the 4 and 5 and not 0 and 1 as it is occurring. Look at i instead of 0. It's often hard to see this from lack of legibility.

for (int k = i; k < (n + i); k++) {

See:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int i;
    printf("\nDigite a quantidade de numeros que serao digitados: ");
    scanf ("%d", &i);
    int *p = malloc(i * sizeof(int));
    if (p == NULL) {
        printf ("\nERRO.MEMORIA INSUFICIENTE");
        exit(1);
    }
    for (int k = 0; k < i; k++) {
        printf ("\nDigite o % do valor do vetor: ", k + 1);
        scanf ("%d", &p[k]);
    }
    printf("\n\n========== VETOR PREENCHIDO ==========\n");
    for (int k = 0; k < i; k++) printf ("%d\t", p[k]);
    printf("\n\nSeu vetor possui %d elementos.", i);
    printf("\nDigite um valor positivo para aumentar ao vetor.");
    printf("\nDigite um valor negativo para diminuir do vetor.\n\n");
    int n;
    scanf("%d", &n);
    if (!(i + n)) {
        printf("\nSeu vetor possui 0 elementos.\n\n");
        exit(1);
    } else if ((i + n) < 0) {
        printf("\nSeu vetor possui quantidade negativa de elemento.\n\nIMPOSSIVEL ALOCAR MEMORIA.\n\n");
        exit(1);
    }
    p = realloc(p, (i + n) * sizeof(int));
    if (p == NULL) {
        printf("\nERRO DE RE-ALOCACAO.MEMORIA INSUFICIENTE");
        exit(1);
    }
    for (int k = i; k < (n + i); k++) { //<==================== o erro estava aqui
        printf("\nDigite o % do valor do vetor: ",k+1);
        scanf("%d", &p[k]);
    }
    printf("\n\n========== VETOR PREENCHIDO REALOCADO ==========\n");
    for (int k = 0; k < (n+i); k++) {
        printf("%d\t", p[k]);
    }
    free(p); //na prática não é necessário aqui porque o programa vai encerrar, mas pra fins de aprendizado ok
}

See running on ideone . And at Coding Ground . Also I put it in GitHub for future reference .

    
25.06.2017 / 15:16