Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [c]Errore di segmentazione ed fgets() saltata, alberi di ricerca binari

    Sto scrivendo un programma didattico con gli alberi di ricerca binaria.

    I problemi son 2:
    -nella funzione visualizza, alla prima riga, mi da una violazione di accesso, errore di segmentazione, se uso il debug.
    -nel secondo caso dello switch, non mi legge la fgets il cui argomento è n->indirizzo, quella commentata affianco tanto per intenderci.

    Quali sono gli errori?

    codice:
    //*16. Utilizzando un albero binario di ricerca gestire un programma RUBRICA in cui in ogni nodo sono memorizzati i dati seguenti:
    a. Cognome
    b. Nome
    c. Sesso (M o F)
    d. Indirizzo
    e. Telefono
    f. Età
    
       Applicare il seguente menù:   
       0 - esci
        1 - Inserisci nuovo elemento con caricamento ordinato per cognome e quindi per nome
        2 - Cerca elemento X
        3 - Visualizza tutto
        4 - Statistiche: età media dei maschi e delle femmine
        5 - Modifica dati elemento X
        6 - Incrementa l'età d’ogni elemento di 1 (nuovo anno)*/
    
    #include <conio.h>
    #include <stdio.h>
    #include <string.h>
    
    typedef struct rubr{
            char cognome[20];
            char nome[20];
            char sesso;
            char indirizzo[20];
            char tel[10];
            int eta;
            struct rubr *left;
            struct rubr *right;
            }alb;
    
    void inizializza(alb **r){
          *r=NULL;
    }
    
    alb *inserisci(alb *r, char cognome[]){
         if(r==NULL){
              r=(alb *)malloc(sizeof(alb));
              r->left=NULL;
              r->right=NULL;  
              return r;
         }else if(strcmp((r->cognome),cognome)<0){
              return inserisci(r->left,cognome);
         }else{
              return inserisci(r->left,cognome);
         }
    }
    
    void visualizza(alb *r){
         if(r->left!=NULL)
              visualizza(r->left);
         //puts(r->cognome);
         printf("%s",r->cognome);
         if(r->right!=NULL)
              visualizza(r->right);     
    }
    
    void menu(){
         printf("0-Esci\n");
         printf("1-Inserisci un nuovo contatto\n");
         //printf("0-Inserisci un nuovo contatto\n");
         printf("3-Visualizza\n");
         printf("Inserisci la tua scelta: ");
    }
    
    main(){
           alb *root;
           inizializza(&root);
           int scelta=1;
           char cognome[20];
           
           while(scelta!=0){
                 system("cls");
                 menu();
                 scanf("%d",&scelta);
                 switch(scelta){
                      case 1:
                           system("cls");
                           printf("Inserisci il cognome,\n\t il nome,\n\t il sesso(S o M),\n\t l'indirizzo,\n\t il telefono \n\te l'eta',\n ognuno separato da un invio: ");
                           fflush(stdin);
                           fgets(cognome, sizeof(cognome), stdin);
                           alb *n=inserisci(root, cognome);
                           strcpy(cognome,n->cognome);
                           fgets(n->nome, sizeof(n->nome), stdin);
                           scanf("%c",&n->sesso);
                           fgets(n->indirizzo, sizeof(n->indirizzo), stdin); //this fgets() isn't called
                           fgets(n->tel, sizeof(n->tel), stdin);
                           scanf("%d",&n->eta);                       
                           break;
                      /*case 2:
                           
                           break;  */             
                      case 3:
                           system("cls");
                           visualizza(root);
                           getch();
                           break;
                 }
           }
    }

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Per le fgets basta che aggiungi un
    codice:
    while(getchar()!='\n');
    dopo ogni scanf che precede un fgets...

    Ciò succede perchè scanf non consuma tutti i caratteri in input, ma solo quelli di cui necessita, perciò devi eliminare tutti i caratteri restanti fino al ritorno a capo ('\n') compreso...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    E per quanto riguarda la funzione visualizza può essere che sia perchè richiami la funzione con NULL (caso non gestito dalla tua funzione)...

    Puoi benissimo semplificare la funzione a
    codice:
    void visualizza(alb *r){
         if(r!=NULL) {
             visualizza(r->left);
             printf("%s", r->cognome);
             visualizza(r->right);  
         }   
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    Originariamente inviato da Scara95
    E per quanto riguarda la funzione visualizza può essere che sia perchè richiami la funzione con NULL (caso non gestito dalla tua funzione)...

    Puoi benissimo semplificare la funzione a
    codice:
    void visualizza(alb *r){
         if(r!=NULL) {
             visualizza(r->left);
             printf("%s", r->cognome);
             visualizza(r->right);  
         }   
    }
    grazie per la risposta, ma qui mi da lo stesso errore ma alla seconda riga...

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Originariamente inviato da giacomotb
    grazie per la risposta, ma qui mi da lo stesso errore ma alla seconda riga...
    Non so perché ti dia un errore d'accesso dato che in quella seconda riga non ci arriverà mai col tuo codice iniziale, in quanto root resterà sempre NULL...
    Al momento non ho un compilatore a portata di mano, in ogni caso posta il codice come l'hai modificato ora...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.