Linguagem C, Problemas com impressão em ponteiros

Bom vou postar o código todo, mas ao que parece ta tudo funcionando, só quando vou imprimir o nome e a matricula de todos ele só imprime “lixo”…
alguem sabe o que pode ser?

[code]#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct lista
{
char nome[81];
char matricula[8];
char turma[20];
float p1;
float p2;
float p3;
struct lista* prox; //Definindo Lista
};

typedef struct lista Lista;

Lista* preenche(Lista* l,char nome[81], char matricula[8], char turma[20], float p1, float p2, float p3);
Lista* inicializa(); //protótipos
int imprime(Lista* l);
Lista* remove(Lista* l, char apagar[8]);

Lista* inicializa()
{
return(NULL); //Função que inicializa a lista
}

Lista* preenche(Lista* l,char nome[81], char matricula[8], char turma[20], float p1, float p2, float p3)
{
Lista* novo=(Lista*) malloc(sizeof(Lista)); //Função que Preenche a lista
novo->nome[81]=nome[81];
novo->matricula[8]=matricula[8];
novo->turma[20]=turma[20];
novo->p1=p1;
novo->p2=p2;
novo->p3=p3;
novo->prox=l;
return novo;
}

int imprime(Lista* l)
{
Lista* p;
printf("**********************************\n");
for(p=l;p!=NULL;p=p->prox) //Função que imprime os itens da lista
{

      printf("**\tmatricula = %s\t\t**\n", p->matricula);
      printf("**\tnome = %s\t\t**\n", p->nome);
      printf("**\taponta para = %p\t**\n", p->prox);
    }
printf("**********************************\n");

}

Lista* remove(Lista* l, char apagar[8])
{
Lista* ant=NULL;
Lista* p=l;
while(p!=NULL&&strcmp(apagar,p->matricula))
{
ant=p;
p=p->prox;
}
if(p==NULL)
{
printf("\nNumero nao encontrado na lista"); //Função de Remoção
return l;
}
if(ant==NULL)
{
l=p->prox;
}
else
{
ant->prox=p->prox;
}
free§;
return l;
}

int main()
{
Lista *l;
int opcao=0;
char apagar[8];
char nome[81];
char matricula[8];
char turma[20];
float p1;
float p2;
float p3;

 while(opcao!=5){
 printf("\n1---Inicializar");
 printf("\n2---Preenchimento");                               //Método Main
 printf("\n3---Remocao");
 printf("\n4---Imprime os numeros da lista");
 printf("\n5---Fim\n\n");  
 scanf("%d",&opcao);                              
 switch(opcao)
 {
    case 1: {l=inicializa();
             break;}
    
    case 2: {fflush(stdin);
             printf("\nDigite o nome do aluno a ser cadastrado: \n");
             scanf("%s",&nome);
             printf("\nDigite o numero da matricula: \n");
             scanf("%s",&matricula);
             printf("\nDigite a turma: \n");
             scanf("%s",&turma);
             printf("\nDigite a 1ª nota do aluno: \n");
             scanf("%f",&p1);
             printf("\nDigite a 2ª nota do aluno: \n");
             scanf("%f",&p2);
             printf("\nDigite a 3ª nota do aluno: \n");
             scanf("%f",&p3);
             l=preenche(l,nome,matricula,turma,p1,p2,p3);
             break;}
             
    case 3: {printf("\nDigite o numero da matricula para excluir o aluno da lista\n");
             scanf("%s",&apagar);
             remove(l,apagar);
             break;}
             
    case 4: {imprime(l);
             break;}
             
    case 5: {printf("\nSaindo...");
             break;}
    
    default:{printf("\nOpcao invalida\n");}
 }
 }
 getch();
 return(0);

}

[/code]

Fala Diego…

existem vários problemas com seu código, não só na impressão… um deles, por exemplo, é na inserção… você está atribuindo char ao invés de strings… substitua isso:

novo->nome[81]=nome[81];
novo->matricula[8]=matricula[8];
novo->turma[20]=turma[20];

por isso:

strcpy(novo->nome, nome);
strcpy(novo->matricula, matricula);
strcpy(novo->turma, turma);

utilize sempre strcpy para atribuição de strings… lembrando que em C não existe o tipo de dado string, sendo um vetor de caracteres, certo?

no mais, existem outros problemas no seu código (de ponteiros, por exemplo)… aconselho dar uma olhada com mais cuidado…

Espero ter ajudado… abraços!

Já ajudou, mas ainda não imprimiu, deve ser o tal problema com os ponteiros que vc falou…
Mas aonde está esses problemas q vc disse? nao consigo enchergar…

então… eu não tenho o compilador aqui pra executar… mas por exemplo, na declaração de l, o faça apontar para NULL, pois se não fizer isso, a lista não terá seu fim apontando pra null de acordo com sua inserção… acho q isso resolve o problema da inserção e impressão…

abraços!

Na função preenche eu coloquei
turmas=NULL;

só isso já adianta será? pq aki nao deu certo nao…

Fiz uns testes aqui e na verdade o erro está aqui:

[code]int imprime(Lista* turmas, float medias)
{
Lista* p;
float media;
printf("**********************************\n");
for(p=turmas;p!=NULL;p=p->prox) //Função que imprime os itens da lista
media=(((p->p1)+(p->p2)+(p->p3))/3);
{
printf("%s, %s, %s, %.2f\n",p->matricula,p->nome,p->turma,p->p1);

    }
printf("**********************************\n");

}[quote]

Só nao sei pq

na verdade você está tentando acessar um local na memória que você não alocou, pois pelo que parece p->prox nunca será null!

ae to precisando de ajuda pra fazer um relatorio detalhado do seguinte codigo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct cliente
{
       char nome[50];
       char endereco[100];
       int cpf;
       int fone;
       struct cliente *prox;
} DadoCliente;

DadoCliente *buscar_cliente(DadoCliente *cabeca_cliente, int n);
void insere_ordenado(DadoCliente **cabeca_cliente);
void listar_cliente(DadoCliente *cabeca_cliente);
void atualizar_dados_cliente(DadoCliente **cabeca_cliente);
void remover_cliente(DadoCliente **cabeca_cliente , int existe);
void imprimir_busca_cliente(DadoCliente *aux_cliente);

//Este procedimento é para o usuário cadastrar um cliente.
void insere_ordenado(DadoCliente **cabeca_cliente)
{  
 
   char aux[50];
   int num;  
   char endereco[100];
   int cpf;
   int fone;

   printf("CPF: ");   
   scanf("%d%*c",&num);
   int achou = 0;

  
   DadoCliente *novo = malloc(sizeof(DadoCliente));
   DadoCliente *ant = NULL; 
   DadoCliente *p = *cabeca_cliente; 

   while( p != NULL )
   {   
      if (p->cpf == num)
      {
         printf("CPF %d ja cadastrado!!\n nao inserido!!",num );
         achou = 1;
         p = NULL ;
      }
      else
      {
         ant = p;
         p = p->prox;                            
      }
   } 
          
   if ( achou != 1 )
   {
      novo->cpf = num;
      printf("Nome: ");
      scanf("%49[^\n]",aux);    
      strcpy(novo->nome, aux);          
      printf("Telefone: ");   
      scanf("%d%*c",&fone);
      novo-> fone = fone; 
      printf("Endereco: ");
      scanf("%99[^\n]",endereco);
      strcpy(novo->endereco, endereco);  
      ant = NULL;
      p = *cabeca_cliente;   
      while( p != NULL )
      {    
         if ( strcmp(p->nome, aux) < 0 || strcmp(p->nome, aux)== 0)
         {
            ant = p;
            p = p->prox;               
         }
         else if ( strcmp(p->nome, aux) > 0 )
         {
            p = NULL; 
         } 
      }
      if (ant == NULL)  
      {
         novo->prox = *cabeca_cliente;
         *cabeca_cliente = novo;           
      }
      else 
      {
         novo->prox = ant->prox;
         ant->prox = novo;
      } 
   }
}

//Este procedimento lista todos os dados cadastrados para uma dada estrutura ou classe.
void listar_cliente(DadoCliente *cabeca_cliente)
{
    int i=0;
    while (cabeca_cliente != NULL)    
    {
        i++;
        printf("\n\nElemento %d\n", i);
        printf("Nome: %s\n",cabeca_cliente->nome);
        printf("CPF: %d\n",cabeca_cliente->cpf);
        printf("Endereco: %s\n",cabeca_cliente->endereco);
        printf("Telefone: %d\n",cabeca_cliente->fone);
        cabeca_cliente = cabeca_cliente->prox;    
    }
}





//Este procedimento tem a opção de atualizar dados cadastrais de um cliente.
void atualizar_dados_cliente(DadoCliente **cabeca_cliente)
{
     char nome[50];
     char endereco[100];
     int cpf;
     int fone;
     int aux;
     DadoCliente *ptr;
     
     ptr= *cabeca_cliente;
     
     if ( ptr == NULL)
     {
        printf("Nenhum cliente cadastrado!!");
     }
     else
     {
         aux=0;
         printf("Insira o CPF:");   
         scanf("%d%*c",&cpf); 
         int i=0;
         while( ptr != NULL)   
         {
                if (ptr->cpf == cpf)
                { 
                   printf("Nome: ");   
                   scanf("%49[^\n]%*c",nome);
                   strcpy(ptr->nome,nome);
                   printf("Endereco: ");   
                   scanf("%99[^\n]%*c",endereco); 
                   strcpy(ptr->endereco,endereco);
                   printf("Telefone: ");   
                   scanf("%d%*c",&fone);
                   ptr->fone=fone;
                   aux=1;
                }
                ptr= ptr->prox;
         }
         if (aux != 1)
         {
             printf("O cliente nao encontrado!!");
         }
     } 
}

//Esta busca serve para o usuário  buscar dados cadastrais do cliente o.o programa solicita o usuario o cpf e deverá retornar os dados cadastrais
DadoCliente *buscar_cliente(DadoCliente *cabeca_cliente, int n)
{
   DadoCliente *aux_busca = cabeca_cliente;
   DadoCliente *aux = NULL;
   int achou = 0;
   while ((aux_busca->prox != NULL)&&(aux_busca->cpf != n))
   {
      aux_busca = aux_busca->prox;
   }
   if (aux_busca->cpf == n)
   {
      return aux_busca;
   }
   else
   {
      return NULL;
   }
}

//Este procedimento é para o usuário deletar o cadastro de um cliente, usando o cpf para buscar esse cadastro.
void remover_cliente(DadoCliente **cabeca_cliente , int existe)
{
     DadoCliente *aux1 = NULL;
     DadoCliente *aux2 = *cabeca_cliente;
     int achou=0;
     char conf[2];
     if (*cabeca_cliente == NULL)
     {
        printf("Erro: Lista vazia ou posicao invalida!!\n");
     }
     else
     {
        
         while ((aux2 != NULL) && (aux2->cpf != existe))
         {   
               aux1 = aux2;
               aux2 = aux2->prox; 
         }
         if(aux2 == NULL)
         {
             printf("\nCliente nao encontrado!!\n");
             
         }
        
         if (aux1 == NULL)
         {
            printf ("\nNome: %s",aux2->nome);
            printf("\nCpf: %d",aux2->cpf);
            printf("\nTelefone: %d",aux2->fone);
            printf("\nEndereco: %s", aux2->endereco);
            printf ("\nRemover o cliente??? (S/N):");
            scanf("%s",&conf);
            if((conf[0]== 'S')||(conf[0] == 's'))
            {
              
               *cabeca_cliente = aux2->prox;
               free(aux2);
               achou = 1;
               if (achou==1)
               {
                  printf("\nCliente removido com sucesso!!");
               }
               
            }
            else
            {
                if((conf[0]== 'N')||(conf[0] == 'n'))
                {
                   printf("Remocao cancelada!!!");
                }
            }             
         }
         else
         {
             
            printf ("\nNome: %s",aux2->nome);
            printf("\nCpf: %d",aux2->cpf);
            printf("\nTelefone: %d",aux2->fone);
            printf("\nEndereco: %s", aux2->endereco);
            printf ("\nDeseja remover o cliente??? (S/N):");
            scanf("%s",&conf);
            if((strcmp(conf,"S"))||(strcmp(conf ,"s")))
            {
            
             aux1->prox = aux2->prox;
             free(aux2);
             printf("\nCliente removido com sucesso!!");
             }
            else
            {
                if((conf[0]== 'N')||(conf[0] == 'n'))
                {
                   printf("Remocao cancelada!!");
                }
            } 
         }
     }    
}

//o procedimento vai imprimir na tela todos os clientes cadastrados.
void imprimir_busca_cliente(DadoCliente *aux_cliente)
{
    printf ("\nNome: %s",aux_cliente->nome);
    printf("\nCpf: %d",aux_cliente->cpf);
    printf("\nTelefone: %d",aux_cliente->fone);
    printf("\nEndereco: %s", aux_cliente->endereco);
}