Ir ao conteúdo

Posts recomendados

Postado

Fiz este algoritmo para ler um vetor e imprimí-lo na ordem inversa, por exemplo: o primeiro troca com o último, o segundo com o penúltimo etc. Porém ao rodar o programa, apenas retorna: "*** stack smashing detected ***: terminated
Aborted". Alguém sabe o por quê?

#include <stdio.h>
#include <stdlib.h>
#define N 30

int main() {
   int i, j, tmp, vet[N];
   for(i = 0 ; i < N ; i++)
    vet[N] = rand();
   
  int fim = N-1;
  for(i = 0; i < N/2; i++){
    tmp = vet[i];
    vet[i] = vet[fim];
    vet[fim] = tmp;
    fim--;
  }
   
   for(i = 0 ; i < N; i++)
    printf("%d",vet[i]);
    
    return 0;
}

 

Postado

Ao compilar seu programa preste atenção às mensagens de erro

 

E habilite todas. E trate todas.

 

Não disse que sistema ou compilador usa.

 

Eis uma possível saída:

 

original1.c(7,12): warning C4101: 'j': unreferenced local variable
original1.c(8): error C4789: buffer 'vet' of size 120 bytes will be overrun; \
    4 bytes will be written starting at offset 120

 

Claro que seu computador pode estar mostrando as mensagens em português.

 

E o que tem na linha 8?

 

    for (i = 0; i < N; i++) vet[N] = rand();

 

E o que é vet?

 

#define N 30

int main()
{
    int i, j, tmp, vet[N];

 

Assim é: tenta escrever em vet[30] e é o que a mensagem diz. 4 bytes serão gravados no deslocamento 120.

 

E 116 é o máximo que pode usar, já que um int nessa plataforma claramente usa 4 bytes

 

Se usa gcc use -WAll se usa MSVS use /W3 no mínimo. 

 

 

Seu programa não está bom.

 

Declare as variáveis de controle DENTRO do for.

Declare uma variável por linha

'fim' só é usado dentro do loop então declare lá

j não é usado, como disse o compilador. 

Se não mostrar o vetor antes como vai saber se inverteu??????????????????????

Compare com o simples:

 

#include <stdio.h>
#include <stdlib.h>
#define N 9

int main(void)
{
    srand(220703);
    int vet[N];
    for (int i = 0; i < N; i++)
        vet[i] = rand() % 1000, printf("%3d  ", vet[i]);
    printf("\n\n");

    for (int i = 0, fim = N - 1, tmp; i < N / 2; i++, fim--)
        tmp = vet[i], vet[i] = vet[fim], vet[fim] = tmp;

    for (int i = 0; i < N; i++) printf("%3d ", vet[i]);
    printf("\n");

    return 0;
}

 

Que mostra

 

633  662  944  136  876  796   55  824  913

913 824  55 796 876 136 944 662 633

 

Note que o printf() como escreveu apenas imprime tudo grudado e só depois de invertido então não daria pra saber nada: nem se funcionou nem onde começa um número e termina outro

Postado

Refiz o código, porém os valores retornados do vetor invertido ainda não estão corretos.

Minha entrada:

1

2

3

4

5

6

Saída do vetor invertido:

1

2

3

5

6

7995497

#include <stdio.h>
#include <stdlib.h>
#define LIM 100

int main() {
   int n, v[LIM], i, j, aux;
   printf("Digite o tamanho do vetor: \n");
   scanf("%d",&n);
   
   printf("Digite os %d valores do vetor: \n",n);
   for(i = 0 ; i < n ; i++)
   	scanf("%d",&v[i]);
   	
   printf("Vetor original: \n");
   for(i = 0 ; i < n ; i++)	
	printf("%d\n",v[i]);
   
   j = n - 1;
   for(i = 0 ; i < n / 2 ; i++){
   	aux = v[n];
   	v[n] = v[j];
   	v[j] = aux;
   	j--;
   }
   
   printf("\n\nVetor invertido: \n");
   for(i = 0 ; i < n ; i++)	
   	printf("%d\n",v[i]);
   
    return 0;
}

 

  • Curtir 1
Postado

Você leu o que eu escrevi? 

 

Porque agora um programa interativo? Qual a vantagem?

 

37 minutos atrás, arfneto disse:

Declare as variáveis de controle DENTRO do for.

Declare uma variável por linha

 

Só vai perder tempo na hora de testar. E se fossem 40 números?

 

teste SEMPRE o retorno de scanf. LEia o manual. É ingênuo não testar. 

mostrando um valor por linha é muito mais difícil de conferir. Notou a diferença entre o seu programa e o exemplo que eu mostrei? 

1 hora atrás, ningumx disse:
  tmp = vet[i];
    vet[i] = vet[fim];
    vet[fim] = tmp;

 

era assim antes

 

6 minutos atrás, ningumx disse:
   	aux = v[n];
   	v[n] = v[j];
   	v[j] = aux;
   	j--;

 

e mudou para isso.Porque?

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...