How to store vector values?

Asked

Viewed 365 times

3

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

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

How to make it store what has already been stored at a first moment in the vector?

Not I was able to leave stored the values that the user type the first time when the vector is allocated and then only populate by reallocating the values of the NEW POSITIONS, that is, let the user fill in new values only in these new positions and KEEP PREVIOUSLY TYPED NUMBERS

#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");
  }

1 answer

2


I gave an improved readability of the code and gave a modernized, but the same error is time to get the positions of the new array. It is starting at the 0 position that has already been filled, it has to start from where it left off in the old one, since the new one has 5 positions and has to fill the 4 and 5 and not 0 and 1 as it is happening. Look at the i instead of 0. It is often difficult to perceive this by the lack of readability.

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

Behold:

#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
}

Behold working in the ideone. And in the repl it.. Also put on the Github for future reference.

  • 1

    Switch compiler, this one is very old and will teach you to do everything wrong, or see if you have to configure it to use C99.

  • Sorry, I accidentally deleted the comment, I wanted to edit it. I’m just a beginner yet, how do I change to C99? (I don’t know what that is)

  • GOT IT BUDDY, I’m using Codeblocks, I was able to activate C99, I went to Settings>Compiler>, and I checked the option -Std=C99... but what is it? heheheheh

  • 1

    You were using a very old C configuration, 99 is the year of standardization. Codeblocks is not a compiler, it’s just an IDE. https://answall.com/q/101691/101

  • 1

    @Weise: C99 is this here. Has also C89/C90 and C11.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.