Agenda telefonica com funções e ponteiros...
Você está programando para ambientes Microsoft ?
Se sim, "clear" não é um programa nativo dos sistemas Microsoft (Windows Family), logo, a chamada da função system irá gerar um warning do sistema operacional em runtime.
Se estiver programando para ambientes Linux/Unix, estude também como funcionam os debuggers. Aliás, uma boa ajuda para você descobrir o problema do seu programa é colocar alguns "printf"s para mostrar o conteudo das variaveis em todo o programa, assim saberá quais as funções que o programa chamou, o que ele executou ou não. Esta é a maneira fácil de achar um problema, caso você não saiba utilizar um debugger.
Você está utilizando alguma IDE (KDevelop, Eclipse, C++Builder, DevC++, etc) para programar ? Se sim, todas elas possuem um debugger interno, que economiza MUITO tempo para resolver problemas de lógica. Você pode parar o programa em tempo de execução, em uma determinada linha, assim poderá ver o valor das variáveis, sem precisar colocar "printf"s.
Qualquer coisa, posta aí denovo.
Agenda telefonica com funções e ponteiros...
Estou programando para Linux-Unix
Não esto usando nenguma IDE
Eu fiz algumas alterações, conforme as dicas que foram dadas, o problema eh que agora ao digitar o nome para cadastrar, eu obtenho um Segmentation Fail, jah tentei resolve-lo e mesmo assim nada, segue o codigo alterado:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
/* ## Declaração da estrutura ## */
struct registros{
char nome[50];
char tel[10];
char endereco[50];
struct registros *proximo; /* Ponteiro que corresponde ao proximo registro */
struct registros *anterior; /* Pomteiro que corresponde ao registro anterior */
} lista;
struct registros *ultimo; /* Ultimo registro */
struct registros *primeiro; /* Primeiro */
struct registros *vazio; /* Ponteiro NULL */
/* ## Prototipos das funções ## */
void menu(void);
void inserir(void);
void listar(void);
void mostrar(struct registros *este);
void inserirvalor(char *pergunta, char *var, int tam);
/* ## Função MAIN */
int main(){
menu(); /* Chama o menu */
}
/* --------------------*/
/* ## Função MENU */
void menu(void)
{
system("clear");
vazio = (struct registros *) malloc(sizeof(lista));
int opcao;
printf ("\nAgenderecoa Telefica v0.1 by c0dek\n----------\n\nDigite o numero correspondente a sua opção: \n\n");
printf ("\n1. Inserir");
printf ("\n2. Listar");
printf ("\n3. Sair deste programa");
printf ("\n----------\n");
printf("\nSua opção: ");
puts(" ");
do{ scanf("%d", &opcao);
switch(opcao){
case 1:
inserir();
break;
case 2:
listar();
break;
case 3:
exit(0);
default: printf("\nOpção invalida!");
}
} while (1);
}
/* --------------------*/
/* ## Função INSERIR */
void inserir(void)
{
char opcao;
char value[255];
struct registros *este; /* Ponteiro este apontando para a estrutura registros */
este =(struct registros *) malloc(sizeof(lista)); /* Allocando memória */
if (este == 0){
printf("\nMemória insuficiente para alocação!");
return;
}
do{
inserirvalor("\nQual o nome do contato: ", "este->nome", 50); /* O Olho do furacão, passo os valores para a função inserirvalor */
inserirvalor("\nQual o tel do contato: ", "este->tel", 50);
inserirvalor("\nQual o endereco do contato: ", "este->endereco", 50);
if(primeiro!=0){
ultimo->proximo = este;
este->anterior = ultimo;
ultimo = este;
este->proximo = vazio;
} else {
primeiro = este;
ultimo = este;
este->proximo = vazio;
este->anterior = vazio;
}
printf("\nInserir mais um registro?[y/n]"); /* Pergunta se deseja inserir outro registro */
opcao=getchar();
fflush(stdin);
}while (opcao != 'n' && opcao != 'N');
printf("\nDesalocando memória...");
free(este);
main();
}
/* --------------------*/
/* ## Função LISTAR */
void listar(void)
{
int opcao;
struct registros *este;
este = primeiro;
do{
system("clear");
mostrar(este);
printf("\n1. Proximo Registro - 2. Registro Anterior - 3. Voltar para o Menu");
scanf("%d", &opcao);
fflush(stdin);
switch(opcao){
case 1:
if(este->proximo == vazio){
printf("\nUltima entrada...");
sleep(1);
return;
}
este = este->proximo;
case 2:
if(este->anterior == vazio){
printf("\nPrimeira entrada...");
sleep(1);
return;
}
este = este->anterior;
case 3:
return;
}
} while (1);
return;
}
/* --------------------*/
/* ## Função mostrar */
void mostrar(struct registros *este)
{
printf("\n\n\n-- Inicio do contato --");
printf("\nNome: %s", este->nome);
printf("\nTelecone: %s", este->tel);
printf("\nenderecoereço: %s", este->endereco);
printf("\n-- Fim do contato --\n\n\n");
return;
}
/* --------------------*/
/* ## Função inserirvalor */
void inserirvalor(char *pergunta, char *var, int tam)
{
struct registros *este; /*Ponteiro este apontando para a estrutura registros */
char value[200]; /* Variavel que guarda o valor temporário */
printf("%s", var); /* Imprime a variavel de destino soh pra garantir... */
printf("%s", pergunta); /* Imprime a pergunta */
scanf("%s", value); /* Escaneia seu valor */
strncpy(var, value, tam); /* Passa para a variavel de destino */
}
/* --------------------*/
Agenda telefonica com funções e ponteiros...
Está errado utilizar aspas duplas no buffer de destino:
Código :
inserirvalor("\nQual o nome do contato: ", "este->nome", 50);
inserirvalor("\nQual o tel do contato: ", "este->tel", 50);
inserirvalor("\nQual o endereco do contato: ", "este->endereco", 50);
Você precisa passar o buffer onde será armazenado o que você digitou, ficaria sem as aspas duplas:
Código :
inserirvalor("\nQual o nome do contato: ", este->nome, 50);
inserirvalor("\nQual o tel do contato: ", este->tel, 50);
inserirvalor("\nQual o endereco do contato: ", este->endereco, 50);
Agenda telefonica com funções e ponteiros...
ph0enix, vlw pela ajuda, mais se eu deixar sem aspas, a função inputs não recebe o valor da variavel corretamente ( eu acho ), pq se eu dexar sem aspas o printf que tem na função inputs que retorna a variavel de destino como garantia não retorna nada, ah num sei veio tah mto confuso eu acho que eu deveria deixar este projeto de lado por enquanto e partir pra outra, quando chegar a hora eu mexo nessa agenda denovo c num acha naum ph0enix?
Agenda telefonica com funções e ponteiros...
e vc acha q encontrarah problemas diferentes desses?
char msg[]="Welcome to the Jungle!";
(antes de programar em C, faça "portugues-estruturado" num editorzinho, sua vida seria muito mais alegre. E como o ph0enix disse, debug. Um simples printf("aqui 1") resolve 97,3% das vezis)