rkd 0 Denunciar post Postado Junho 16, 2011 Pessoal o seguinte codigo abaixo está apresentando erro "Não Enviar, programa sera fechado" quando tento adicionar outro campo para registro de endereço, logo tipo char. Codigo funcional somente com inteiros: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define BUFFER 64 /* Estrutura da lista declarada para armazenar nossos dados. */ typedef struct lista { char *nome; int idade; int cpf; int rg; int tel; //char *end; struct lista *proximo; } Dados; /* Prototipo das funcoes de manuseio dos dados. */ Dados *inicia_dados(char *nome, int idade, int cpf, int rg, int tel); Dados *insere_dados(Dados *dados, char *nome, int idade, int cpf, int rg, int tel); void exibe_dados(Dados *dados); void busca_dados(Dados *dados, char *chave); Dados *deleta_dados(Dados *dados); int checa_vazio(Dados *dados); /* Prototipo das funcoes do menu.*/ void insere(void); void exibe(void); void busca(void); void deleta(void); /* Inicializa a estrutura de dados principal. */ Dados *principal = NULL; /* Cria a nova lista apontando o proximo nó para NULL. */ Dados *inicia_dados(char *nome, int idade, int cpf, int rg, int tel) { Dados *novo; novo = (Dados *)malloc(sizeof(Dados)); novo->nome = (char *)malloc(strlen(nome)+1); strncpy(novo->nome, nome, strlen(nome)+1); novo->idade = idade; novo->cpf = cpf; novo->rg = rg; novo->tel = tel; novo->proximo = NULL; return novo; } /* Como a lista nao esta mais vazia, apontamos o proximo no para lista anterior. */ Dados *insere_dados(Dados *dados, char *nome, int idade, int cpf, int rg, int tel) { Dados *novo; novo = (Dados *)malloc(sizeof(Dados)); novo->nome = (char *)malloc(strlen(nome)+1); strncpy(novo->nome, nome, strlen(nome)+1); novo->idade = idade; novo->proximo = dados; novo->cpf = cpf; novo->rg = rg; novo->tel = tel; return novo; } /* Percorre todos os campos da lista e imprime ate o ponteiro proximo chegar em NULL. */ void exibe_dados(Dados *dados) { printf("Cadastro:\n\n"); printf("------------------------\n"); for (; dados != NULL; dados = dados->proximo) { printf("Nome: %s\n", dados->nome); printf("Idade: %d\n", dados->idade); printf("Cpf: %d\n", dados->cpf); printf("Rg: %d\n", dados->rg); printf("Tel: %d\n", dados->tel); printf("------------------------\n"); } getchar(); } /* Percorre cada ponta comparando o nome com a chave. */ void busca_dados(Dados *dados, char *chave) { int achou = 0; printf("Cadastro:\n\n"); for ( ; dados != NULL; dados = dados->proximo) { if (strcmp(chave, dados->nome) == 0) { printf("------------------------\\n"); printf("Nome: %s\\n", dados->nome); printf("Idade: %d\\n", dados->idade); printf("Cpf: %d\n", dados->cpf); printf("Rg: %d\n", dados->rg); printf("Tel: %d\n", dados->tel); printf("------------------------\\n"); achou++; } } if (achou == 0) printf("Nenhum resultado encontrado.\\n"); else printf("Foram encontrados %d registros.\\n", achou); sleep(1); } /* Deleta o ultimo registro inserido. */ Dados *deleta_dados(Dados *dados) { Dados *novo; novo = dados->proximo; free(dados->nome); free(dados); printf("O ultimo registro inserido foi deletado com sucesso.\\n"); sleep(1); return novo; } /* Apena checa se a lista e NULL ou nao. */ int checa_vazio(Dados *dados) { if (dados == NULL) { printf("Lista vazia!\\n"); sleep(1); return 1; } else return 0; } /* Obtem os dados necessarios para chamar as funcoes de manuseio de dados. */ void insere(void) { char *nome; int idade; int cpf; int rg; int tel; //char *end; nome = (char *)malloc(BUFFER); printf("Digite o Nome: "); scanf("%s", nome); printf("\n"); printf("Digite a Idade: "); scanf("%d", &idade); printf("\n"); printf("Digite a Cpf: "); scanf("%d", &cpf); printf("\\n"); printf("Digite a Rg: "); scanf("%d", &rg); printf("\n"); printf("Digite a tel: "); scanf("%d", &tel); printf("\n"); // printf("Digite o Endereco: "); //scanf("%s", end); //printf("\n"); if (principal == NULL) principal = inicia_dados(nome, idade, cpf, rg, tel); else principal = insere_dados(principal, nome, idade, cpf, rg, tel); } void exibe(void) { if (!checa_vazio(principal)) exibe_dados(principal); } void busca(void) { char *chave; if (!checa_vazio(principal)) { chave = (char *)malloc(BUFFER); printf("Digite o nome para buscar: "); scanf("%s", chave); busca_dados(principal, chave); } } void deleta(void) { if (!checa_vazio(principal)) principal = deleta_dados(principal); } int main(void) { char escolha; do { system("cls"); printf("\n\t\tCadastro de Pessoas\n\n"); printf("Escolha uma opcao: \n"); printf("1 - Insere Dados\n"); printf("2 - Exibe Dados\n"); printf("3 - Busca Dados\n"); printf("4 - Deleta Dados\n"); printf("5 - Sair\n\n"); scanf("%c", &escolha); switch(escolha) { case '1': insere(); break; case '2': exibe(); break; case '3': busca(); break; case '4': deleta(); break; case '5': exit(0); break; default: printf("Digite uma opcao valida!\n"); sleep(1); break; } getchar(); /* E para impedir sujeira na entrada da escolha. Nao lembro de nada melhor tambem. */ } while (escolha > 0); /* Loop Principal. */ return 0; } Codigo onde apresenta erro ao tentar capturar endereço #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define BUFFER 64 /* Estrutura da lista declarada para armazenar nossos dados. */ typedef struct lista { char *nome; int idade; int cpf; int rg; int tel; char *end; struct lista *proximo; } Dados; /* Prototipo das funcoes de manuseio dos dados. */ Dados *inicia_dados(char *nome, int idade, int cpf, int rg, int tel, char *end); Dados *insere_dados(Dados *dados, char *nome, int idade, int cpf, int rg, int tel, char *end); void exibe_dados(Dados *dados); void busca_dados(Dados *dados, char *chave); Dados *deleta_dados(Dados *dados); int checa_vazio(Dados *dados); /* Prototipo das funcoes do menu.*/ void insere(void); void exibe(void); void busca(void); void deleta(void); /* Inicializa a estrutura de dados principal. */ Dados *principal = NULL; /* Cria a nova lista apontando o proximo nó para NULL. */ Dados *inicia_dados(char *nome, int idade, int cpf, int rg, int tel, char *end) { Dados *novo; novo = (Dados *)malloc(sizeof(Dados)); novo->nome = (char *)malloc(strlen(nome)+1); strncpy(novo->nome, nome, strlen(nome)+1); novo->idade = idade; novo->cpf = cpf; novo->rg = rg; novo->tel = tel; novo->proximo = NULL; return novo; } /* Como a lista nao esta mais vazia, apontamos o proximo no para lista anterior. */ Dados *insere_dados(Dados *dados, char *nome, int idade, int cpf, int rg, int tel, char *end) { Dados *novo; novo = (Dados *)malloc(sizeof(Dados)); novo->nome = (char *)malloc(strlen(nome)+1); strncpy(novo->nome, nome, strlen(nome)+1); novo->idade = idade; novo->proximo = dados; novo->cpf = cpf; novo->rg = rg; novo->tel = tel; return novo; } /* Percorre todos os campos da lista e imprime ate o ponteiro proximo chegar em NULL. */ void exibe_dados(Dados *dados) { printf("Cadastro:\n\n"); printf("------------------------\n"); for (; dados != NULL; dados = dados->proximo) { printf("Nome: %s\n", dados->nome); printf("Idade: %d\n", dados->idade); printf("Cpf: %d\n", dados->cpf); printf("Rg: %d\n", dados->rg); printf("Tel: %d\n", dados->tel); printf("end: %s\n", dados->end); printf("------------------------\n"); } getchar(); } /* Percorre cada ponta comparando o nome com a chave. */ void busca_dados(Dados *dados, char *chave) { int achou = 0; printf("Cadastro:\n\n"); for ( ; dados != NULL; dados = dados->proximo) { if (strcmp(chave, dados->nome) == 0) { printf("------------------------\\n"); printf("Nome: %s\\n", dados->nome); printf("Idade: %d\\n", dados->idade); printf("Cpf: %d\n", dados->cpf); printf("Rg: %d\n", dados->rg); printf("Tel: %d\n", dados->tel); printf("End: %s\n", dados->end); printf("------------------------\\n"); achou++; } } if (achou == 0) printf("Nenhum resultado encontrado.\\n"); else printf("Foram encontrados %d registros.\\n", achou); sleep(1); } /* Deleta o ultimo registro inserido. */ Dados *deleta_dados(Dados *dados) { Dados *novo; novo = dados->proximo; free(dados->nome); free(dados); printf("O ultimo registro inserido foi deletado com sucesso.\\n"); sleep(1); return novo; } /* Apena checa se a lista e NULL ou nao. */ int checa_vazio(Dados *dados) { if (dados == NULL) { printf("Lista vazia!\\n"); sleep(1); return 1; } else return 0; } /* Obtem os dados necessarios para chamar as funcoes de manuseio de dados. */ void insere(void) { char *nome; int idade; int cpf; int rg; int tel; char *end; nome = (char *)malloc(BUFFER); printf("Digite o Nome: "); scanf("%s", nome); printf("\n"); printf("Digite a Idade: "); scanf("%d", &idade); printf("\n"); printf("Digite a Cpf: "); scanf("%d", &cpf); printf("\\n"); printf("Digite a Rg: "); scanf("%d", &rg); printf("\n"); printf("Digite a tel: "); scanf("%d", &tel); printf("\n"); printf("Digite o Endereco: "); scanf("%s", end); printf("\n"); if (principal == NULL) principal = inicia_dados(nome, idade, cpf, rg, tel, end); else principal = insere_dados(principal, nome, idade, cpf, rg, tel, end); } void exibe(void) { if (!checa_vazio(principal)) exibe_dados(principal); } void busca(void) { char *chave; if (!checa_vazio(principal)) { chave = (char *)malloc(BUFFER); printf("Digite o nome para buscar: "); scanf("%s", chave); busca_dados(principal, chave); } } void deleta(void) { if (!checa_vazio(principal)) principal = deleta_dados(principal); } int main(void) { char escolha; do { system("cls"); printf("\n\t\tCadastro de Pessoas\n\n"); printf("Escolha uma opcao: \n"); printf("1 - Insere Dados\n"); printf("2 - Exibe Dados\n"); printf("3 - Busca Dados\n"); printf("4 - Deleta Dados\n"); printf("5 - Sair\n\n"); scanf("%c", &escolha); switch(escolha) { case '1': insere(); break; case '2': exibe(); break; case '3': busca(); break; case '4': deleta(); break; case '5': exit(0); break; default: printf("Digite uma opcao valida!\n"); sleep(1); break; } getchar(); /* E para impedir sujeira na entrada da escolha. Nao lembro de nada melhor tambem. */ } while (escolha > 0); /* Loop Principal. */ return 0; } Grato Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Junho 17, 2011 É meio complicado você jogar um código com várias linhas, sem dar nenhuma dica do código e esperar que resolvamos o problema para você. Já tentou entender programas de outras pessoas? Tente, não vai ser muito animador. Tente fazer você mesmo, e poste a parte que você não conseguiu, pois fica meio complicado achar um problema no meio de tantas linhas. Já usou um debugger? Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites
guidjos 65 Denunciar post Postado Junho 17, 2011 Quando um programa só funciona "às vezes", ele está quebrado. Sugiro que você divida seu código em alguns arquivos, agregando as funcionalidades relacionadas e isolando (fisicamente) código que realiza operações que, logicamente, não se relacionam. Depois disso, sugiro que tente isolar o erro. Qual a sua teoria sobre a origem do erro? Às vezes ajuda testar suas rotinas isoladamente (teste unitário). Quando conseguir encontrar a fonte do erro, escreva um programa pequeno que o reproduza. Quando tiver um programa pequeno exibindo o erro original, poste-o aqui e lhe ajudaremos. Não me leve a mal. Não tenho tempo para debugar seu código. Posso tirar as suas dúvidas sobre C. Compartilhar este post Link para o post Compartilhar em outros sites