Jump to content
Fórum Script Brasil
  • 0

Printf de stributo de atributo de struct com ponteiro


rpmarques
 Share

Question

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 to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      150.2k
    • Total Posts
      647.5k
×
×
  • Create New...