Página 1 de 4 1234 ÚltimoÚltimo
+ Responder ao Tópico



  1. #1
    c0dek's
    E ai povu, fmz, entaum, eu toh aprendendo a programar em C, dai eu toh fazendo uma agenda telefonica com estruturas e ponteiros, por enquanto eh soh um prototipo, mais mesmo esse prototipo num funciona, já li o código milhares de vezes e não entendo, ele pula alguna scanf, e na parte de listar está muito estranho, compilem e vejam...

    XX --------- INICIO DO CÓDIGO ------------ XX
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>

    struct reg{
    char nome[40];
    char tel[10];
    char end[50];
    struct reg *next; /* Ponteiro que corresponde ao proximo registro */
    struct reg *back; /* Pomteiro que corresponde ao registro anterior */
    } lista;
    struct reg *last; /* Ultimo registro */
    struct reg *first; /* Primeiro */
    struct reg *null; /* Ponteiro NULL */

    main(){
    system("clear");
    null = (struct reg *) malloc(sizeof(lista));
    int opcao;
    printf ("\nAgenda 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);
    }

    inserir(){
    char opcao;
    struct reg *this;
    this =(struct reg *) malloc(sizeof(lista));
    do{if (this == 0){
    printf("\nMemória insuficiente para alocação!");
    return (0);
    }
    inputs("\nInsira o nome do contato: ", this->nome, 40);
    inputs("\nInsira o telefone do contato: ", this->tel, 10);
    inputs("\nInsira o endereço do contato: ", this->end, 50);

    if(first!=0){
    last->next = this;
    this->back = last;
    last = this;
    this->next = null;
    } else {
    first = this;
    last = this;
    this->next = null;
    this->back = null;
    }
    printf("\nInserir mais um registro?[y/n]");
    scanf("%c", &opcao);
    }while (opcao != 'n' && opcao != 'N');
    printf("\nDesalocando memória...");
    free(this);
    main();
    }

    listar(){
    int opcao;
    struct reg *this;
    this = first;
    do{
    system("clear");
    display(this);
    printf("\n1. Proximo Registro - 2. Registro Anterior - 3. Voltar para o Menu");
    scanf("%d", &opcao);
    switch(opcao){
    case 1:
    if(this->next == null){
    printf("\nUltima entrada...");
    sleep(1);
    }
    this = this->next;
    case 2:
    if(this->back == null){
    printf("\nPrimeira entrada...");
    sleep(1);
    main();
    }
    this = this->back;
    case 3:
    main();
    }
    } while (1);
    return;
    }

    display(this)
    struct reg *this;
    {
    printf("\n\n\n-- Inicio do contato --");
    printf("\nNome: %s", this->nome);
    printf("\nTelecone: %s", this->tel);
    printf("\nEndereço: %s", this->end);
    printf("\n-- Fim do contato --\n\n\n");
    return;
    }




    inputs(pergunta, var, tam)
    char *pergunta;
    char *var;
    int tam;
    {
    char value[255];
    printf("%s", pergunta);
    scanf("%s", value);
    if(strlen(value) > tam)
    printf("\nOs dados inseridor superam o limite de caracteres..."); return;
    strcpy(var, value);
    }

    XX ------------------ FIM DO CÓDIGO ----------------- XX

  2. #2
    c0deks
    pow ninguem sabe, eu dei uma lida e ouvi dizer que isso eh problema de buffer, tentei usar um fflush(stdin), mais num adiantou, ninguem tem alguma pista sobre como resolver???



  3. #3
    serrato
    que erro está dando???

  4. #4
    c0dek's
    Os erros saum os seguinter, por exemplo no registrar ele pula o scanf em que pergunta se que registrar outro contato, e no listar ele entra em loop infinito, ou simplesmente naum funciona...



  5. Ola,
    Na funcao inputs(), linhas:
    ....
    if(strlen(value) > tam)
    printf("\nOs dados inseridor superam o limite de caracteres..."); return;
    strcpy(var, value);
    }
    ....

    O if() esta faltando chaves. Pelo q vi, vc quer algo assim:
    .....
    if(strlen(value) > tam){ /* ABRE */
    printf("\nOs dados inseridor superam o limite de caracteres...");
    return;
    } /* FECHA */
    strcpy(var, value);
    }
    ....

    Isso pode resolver alguma coisa (o use de chaves eh desnecessario para 1 comando, nao p/ 1 linha).

    Sobre a funcao listar(), acho melhor vc repensar sua logica (dica: nao chame main(), NUNCA (dê uma olhada/lida sobre Stack e Recursividade)).

    De resto, tah blz! Tah indo muito bem. Umas pequenas dicas:
    - crie prototipos de funcoes, sempre! (funcoes q sao usadas somente no mesmo '.c', no inicio do arquivo '.c'(com a palavra 'static'). Funcoes chamadas por outro modulos, devem ter prototipos em '.h')
    - especifique o tipo de retorno nas funcoes (todas as suas sao int por DEFAULT de compilacao. Isso da uma grande margem a erros! Principalmente se vc nao tiver compilando com -Wall)
    - K&R nao recomendam na Biblia a sintax: func(var) varType var { ... }. Logo, se Eles falam isso, eu presciso falar alguma coisa??? :)
    - evite (mesmo nao sendo c++) usar palavras como 'this' p/ variaveis... entre outras ('null', nao sei como vc nao teve erro com isso, mesmo minusculo) . Use nomes estranhos como 'thisVar'
    - limpar a tela com system("clear") eh bem engenhoso p/ quem tah iniciando. Quando achar a hora certa, leia sobre ncurses (3n), vc nao tera problemas.
    - A declaraçao da sua struct esta certa. Mas tente com typedef, o codigo fica mais limpo.

    (inputs() ainda possui um bufferoverflow, tente achar. Depois veja nscanf(), ou fgets() ... algo assim)

    Falow






Tópicos Similares

  1. Respostas: 13
    Último Post: 05-06-2012, 17:32
  2. Samba com funções do AD
    Por l4serma no fórum Servidores de Rede
    Respostas: 2
    Último Post: 07-04-2007, 15:55
  3. Webmail com funções iguais do Microsoft Outlook 2003
    Por Diego Fucitalo no fórum Servidores de Rede
    Respostas: 4
    Último Post: 10-07-2005, 18:56
  4. Estruturas com funcoes em C
    Por SDM no fórum Linguagens de Programação
    Respostas: 13
    Último Post: 18-06-2004, 14:53
  5. SUPRESA - Telefonica com suporte a linux
    Por epf no fórum Assuntos não relacionados
    Respostas: 5
    Último Post: 20-05-2004, 19:15

Visite: BR-Linux ·  VivaOLinux ·  Dicas-L