Ir para conteúdo
Fórum Script Brasil
  • 0

Printf de stributo de atributo de struct com ponteiro


rpmarques

Pergunta

Olá, sou iniciante na linguagem C e comeceia usar ponteiros recentemente.

Poderiam me ajudar com os eguinte código, no momento em que chama o metodo faz() para imprimir o codigo de uma struct que está pontada por um ponteiro está imprimindo um valor incorreto. Mas é impresso correto se eu imprimir no método main().

Estou quebrando a cabeça para descobrir o porque disso:

#include <stdio.h>

#include <stdlib.h>

int verifica(int codigo);

void incluir();

void faz();

struct livro *ptPrimeiro;

struct livro *ptUltimo;

#define TAM 10;

int numEl = 0;

struct info{

char val[100];

};

struct livro{

//indices = 0-codigo 1-titulo 2-autor 3-editora 4-cidade

int codigo;

struct info inf[5];

struct livro *ptAntLivro;

struct livro *ptProxLivro;

};

int main()

{

int opcao = 0;

while(1){

printf("\n1- Cadastrar um livro\n2- Remove livro\n3- Lista livros");

printf("\nDigite sua opcao: ");

scanf("%d", &opcao);

switch(opcao){

case 1:

incluir();

break;

case 2:

break;

case 3:

faz();

}

//AQUI FUNCIONA, IMPRIME CORRETO O VALOR

printf("\nsegundo testeFIM: %d", (*ptUltimo).codigo);

}

}

void incluir(){

int codigo = 0;

printf("\nDigite o codigo do livro que sera inserido: ");

scanf("%d", &codigo);

//verifica se já há um cadastro de livro com este codigo, chamando o metodo verifica e passado o codigo como parametro

if(verifica(codigo) == 1){

printf("\nCódigo já existe!");

}

else{

struct livro novoLivro; //cria um novo registro

novoLivro.codigo = codigo;

printf("\n%d", novoLivro.codigo);

struct info iTitulo;

struct info iAutor;

struct info iEditora;

struct info iCidade;

fflush(stdin);

char teste[10];

printf("\nDigite o Titulo do livro: ");

//gets(iTitulo.val);

gets(teste);

fflush(stdin); //serve para limpar o buffer de leitura

novoLivro.inf[0] = iTitulo; //guarda titulo no indice 1

printf("\nDigite o nome do autor: ");

gets(iAutor.val);

novoLivro.inf[1] = iAutor; //guarda autor no indice 2

printf("\nDigite o nome da editora: ");

gets(iEditora.val);

novoLivro.inf[2] = iEditora; //guarda editora no indice 3

printf("\nDigite a cidade: ");

gets(iCidade.val);

novoLivro.inf[3] = iCidade; //guarda cidade no indice 4

if(numEl == 0){

ptPrimeiro = (struct livro*) malloc(sizeof(struct livro));

ptPrimeiro = &novoLivro;

ptUltimo = (struct livro*) malloc(sizeof(struct livro));

ptUltimo = &novoLivro;

printf("\nsegundo teste: %d", (*ptUltimo).codigo);

numEl++;

}

else{

novoLivro.ptAntLivro = &ptUltimo;

//struct livro **pt;

//pt = &ptUltimo.ptProxLivro;

// struct livro tmp = *ptUltimo;//melhorar isso

// tmp.ptProxLivro = &novoLivro;

(*ptUltimo).ptProxLivro = &novoLivro;

novoLivro.ptProxLivro = NULL;

printf("\nprimeiro teste: %d", novoLivro.codigo);

ptUltimo = (struct livro*) malloc(sizeof(novoLivro));

ptUltimo = &novoLivro;

printf("\nsegundo teste: %d", (*ptUltimo).codigo);

numEl++;

}

printf("\nLivro cadastrado com sucesso!");

}

}

int verifica(int codigo){

int i;

struct livro *tmp = ptPrimeiro;

for(i = 1; i <= numEl; i++){

if(codigo == (*tmp).codigo){

return 1;

}

else{

tmp = (*tmp).ptProxLivro;

}

}

return 0;

}

void faz(){

int a = (*ptUltimo).codigo;

printf("\nsegundo teste: %d", a);

}

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Olá!

Aqui funcionou... :huh:

O que vi que está errado é na função incluir. Você está atribuindo o último livro ao anterior do novo. Para fazer isso você não deve usar o operador & pois ptUltimo já é um ponteiro. O correto seria:

novoLivro.ptAntLivro = ptUltimo;

Abraços,

Marcelo Utikawa da Fonseca

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...