Ir ao conteúdo
  • Cadastre-se
Guilherme Sixe

Struct! imprimindo lixo? porque?

Recommended Posts

Bom dia pessoal.

 

Estou com um problema estranho no meu código. Quando eu peço para imprimir informações de uma struct, ele imprime apenas de uma variavel da estruct, na outra variavel ele imprimi lixo, como seu eu não atribuísse nada a ela, mas eu atribui, como na variável anterior. Peço que vejem o meu codigo. No final do codigo eu printo as informações das duas variaveis (pokemon_adv e mypokemon) da minha struct pokemon_treinador , mas ele so imprime certo uma (mypokemon), na pokemon_adv ele imprime lixo.

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

typedef struct{
	char nome[20];       //struct dos pokemons iniciais
	int forca;
	int exp;
	char tipo[20];
	int nivel;
	int cura;
	int potencia;
	int ataque;
	
}pokemon;

typedef struct{        //structs dos treinadores
	int exp_total;
	char poke;
}treinador;

typedef struct{
	char nome[20];       
	int forca;
	int exp;
	char tipo[20];
	int nivel;
	int cura;
	int potencia;
	int ataque;
	
} pokemon_treinador;


int main(){
	char jogar;	
	int poke;
	char escolha;
	
	pokemon Bulbassauro = { "Bulbassauro", rand()%10+1, 1, "Treinador", 1, rand()%3+1, 0, (Bulbassauro.forca*Bulbassauro.nivel)+Bulbassauro.exp+Bulbassauro.cura };
	pokemon Squirtle = { "Squirtle", rand()%10+1, 1, "Treinador", 1, 0, 0, (Squirtle.forca*Squirtle.nivel)+Squirtle.exp };
	pokemon Pikachu = { "Pikachu", rand()%10+1, 1, "Treinador", 1, 0, rand()%3+1, (Pikachu.forca*Pikachu.nivel)+Pikachu.exp+Pikachu.potencia };
	pokemon Sandshrew = { "Sandshrew", rand()%10+1, 1, "Treinador", 1, 0, 0, 2*((Sandshrew.forca*Sandshrew.nivel)+Sandshrew.exp) };	
	
	pokemon_treinador pokemon_adv, mypokemon;
		
	treinador treinador1, treinador2;
	treinador1.exp_total=1;
	treinador2.exp_total=1;
	
		
	
	poke=rand()%4+1;// MAQUINA ESCOLHENDO SEU POKEMON INICIAL ALEATORIAMENTE
	if(poke==1){
		pokemon pokemon_adv = { "Bulbassauro", rand()%10+1, 1, "Treinador", 1, rand()%3+1, 0, (Bulbassauro.forca*Bulbassauro.nivel)+Bulbassauro.exp+Bulbassauro.cura };		
	}
	if(poke==2){
	pokemon pokemon_adv = { "Squirtle", rand()%10+1, 1, "Treinador", 1, 0, 0, (Squirtle.forca*Squirtle.nivel)+Squirtle.exp };					
	}
	if(poke==3){
		pokemon pokemon_adv = { "Pikachu", rand()%10+1, 1, "Treinador", 1, 0, rand()%3+1, (Pikachu.forca*Pikachu.nivel)+Pikachu.exp+Pikachu.potencia };	
	}
	if(poke==4){
		pokemon pokemon_adv = { "Sandshrew", rand()%10+1, 1, "Treinador", 1, 0, 0, 2*((Sandshrew.forca*Sandshrew.nivel)+Sandshrew.exp) };	
	}
	
	printf("\t\t\n\n\n                                 [J] para JOGAR\n\n\t\t                 [?] para saber como JOGAR\n\n                                  "); //MENU	
	scanf("%c", &jogar);
	
	switch(jogar){
		case 'J':
			system("cls");
			printf("\n\n Escolha o seu Pokémon incial entre as opções a baixo:\n\n\n [B] BULBASSAURO   [P] PIKACHU   [S] SQUIRTLE   [A] SANDSHREW\n\n  ");
			fflush(stdin);
			scanf("%c", &escolha); //EU ESCOLHENDO MEU POKEMON INICIAL
			if(escolha=='B'){
				system("cls");
				pokemon mypokemon = { "Bulbassauro", rand()%10+1, 1, "Treinador", 1, rand()%3+1, 0, (Bulbassauro.forca*Bulbassauro.nivel)+Bulbassauro.exp+Bulbassauro.cura };
				printf("\n\n Parabéns! Seu primeiro Pokémon é o %s", mypokemon.nome);
				printf("\n\n Nome: %s\n Nivel: %d\n Força: %d\n Tipo: %s\n Ataque:%d\n\n", mypokemon.nome, mypokemon.nivel, mypokemon.forca, mypokemon.tipo, mypokemon.ataque);
				treinador1.poke=='B';					
			}
			if(escolha=='P'){
				system("cls");
				pokemon mypokemon = { "Pikachu", rand()%10+1, 1, "Treinador", 1, 0, rand()%3+1, (Pikachu.forca*Pikachu.nivel)+Pikachu.exp+Pikachu.potencia };
				printf("\n\n Parabéns! Seu primeiro Pokémon é o %s", mypokemon.nome);
				printf("\n\n Nome: %s\n Nivel: %d\n Força: %d\n Tipo: %s\n Ataque:%d\n\n", mypokemon.nome, mypokemon.nivel, mypokemon.forca, mypokemon.tipo, mypokemon.ataque);
				treinador1.poke=='P';				
			}
			if(escolha=='S'){
				system("cls");
				pokemon mypokemon = { "Squirtle", rand()%10+1, 1, "Treinador", 1, 0, 0, (Squirtle.forca*Squirtle.nivel)+Squirtle.exp };
				printf("\n\n Parabéns! Seu primeiro Pokémon é o %s", mypokemon.nome);
				printf("\n\n Nome: %s\n Nivel: %d\n Força: %d\n Tipo: %s\n Ataque:%d\n\n", mypokemon.nome, mypokemon.nivel, mypokemon.forca, mypokemon.tipo, mypokemon.ataque);
				treinador1.poke=='S';				
			}
			if(escolha=='A'){
				system("cls");
				pokemon mypokemon = { "Sandshrew", rand()%10+1, 1, "Treinador", 1, 0, 0, 2*((Sandshrew.forca*Sandshrew.nivel)+Sandshrew.exp) };
				printf("\n\n Parabéns! Seu primeiro Pokémon é o %s", mypokemon.nome);
				printf("\n\n Nome: %s\n Nivel: %d\n Força: %d\n Tipo: %s\n Ataque:%d\n\n", mypokemon.nome, mypokemon.nivel, mypokemon.forca, mypokemon.tipo, mypokemon.ataque);
				treinador1.poke=='W';				
			}
			break;		
		}
		
		system("cls");
																													
		printf("\n\n Pokédex:");
		printf("\n\n Pokemon do adversario:\n Nome:\n Nivel: %d\n Força: %d\n Tipo: \n Ataque:%d", pokemon_adv.nome, pokemon_adv.nivel, pokemon_adv.forca, pokemon_adv.tipo, pokemon_adv.ataque); // ESTA IMPRIMINDO LIXO.
		printf("\n\n Meu Pokémon:\n Nome: %s\n Nivel: %d\n Força: %d\n Tipo: %s\n Ataque:%d\n\n", mypokemon.nome, mypokemon.nivel, mypokemon.forca, mypokemon.tipo, mypokemon.ataque);// ESTA IMPRIMINDO CERTO
		
	system("pause");
	return 0;		
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite.

 

printf("\n\n Pokemon do adversario:\n Nome:\n Nivel: %d\n Força: %d\n Tipo: \n Ataque:%d", pokemon_adv.nome, pokemon_adv.nivel, pokemon_adv.forca, pokemon_adv.tipo, pokemon_adv.ataque); // ESTA IMPRIMINDO LIXO.

 

Esta faltando o operador %s para pokemon_adv.nome e pokemon_adv.tipo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

você não deve declarar variaveis dentro de { e } porque a vida dessas variáveis termina ao sair desse escopo.

Declare pokemon mypokemon fora das chaves dos ifs, assim mypokemon terá visibilidade em todo main, e dentro dos ifs você atribui os valoroes desejados. existem mecanismos mais eficientes que permitem deixar seu código mais limpo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Engraçado que o mypokemon esta td correto, só o pokemon_adv que esta saindo lixo no print.

adicionado 10 minutos depois

Eu fui diminuindo o meu codigo pra saber da onde é o erro. E ele imprimindo lixo no pokemon_adv. Olhe só:

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

typedef struct{
	char nome[20];       //struct dos pokemons iniciais
	int forca;
	int exp;
	char tipo[20];
	int nivel;
	int cura;
	int potencia;
	int ataque;
	
}pokemon;

int main(){
	char jogar;	
	int poke;
	char escolha;
	
	pokemon Bulbassauro = { "Bulbassauro", rand()%10+1, 1, "Treinador", 1, rand()%3+1, 0, (Bulbassauro.forca*Bulbassauro.nivel)+Bulbassauro.exp+Bulbassauro.cura };
		
	pokemon mypokemon = { "Bulbassauro", rand()%10+1, 1, "Treinador", 1, rand()%3+1, 0, (Bulbassauro.forca*Bulbassauro.nivel)+Bulbassauro.exp+Bulbassauro.cura };
	pokemon pokemon_adv = { "Bulbassauro", rand()%10+1, 1, "Treinador", 1, rand()%3+1, 0, (Bulbassauro.forca*Bulbassauro.nivel)+Bulbassauro.exp+Bulbassauro.cura };		

																													
	printf("\n\n Pokemon do adversario:\n Nome:\n Nivel: %d\n Força: %d\n Tipo: \n Ataque:%d", pokemon_adv.nome, pokemon_adv.nivel, pokemon_adv.forca, pokemon_adv.tipo, pokemon_adv.ataque); // ESTA IMPRIMINDO LIXO.
	printf("\n\n Meu Pokémon:\n Nome: %s\n Nivel: %d\n Força: %d\n Tipo: %s\n Ataque:%d\n\n", mypokemon.nome, mypokemon.nivel, mypokemon.forca, mypokemon.tipo, mypokemon.ataque);// ESTA IMPRIMINDO CERTO
		
	system("pause");
	return 0;		
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×