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

    [C] stampare da printf con puntatore a char

    Ho il seguente codice che (si compila correttamente) ma crasha all'esecuzione di questa stringa di comando:

    printf("\n\t %s", p->studente.nome);

    dove il campo .nome è un: char *nome, della variabile struct studente, puntata da p.

    Vi riporto tutto il codice, ma l'errore avviene soltanto li, vi chiedo se sapete dirmi il perchè, in particolare voglio capire se avviene perchè c'è un errore PRECEDENTE, ovvero all'atto della memorizzazione della stringa nel campo nome, oppure se è un errore proprio di quella stringa di comando (ma a me sembra il modo corretto di dirgli di stamparla).

    Ecco il codice.

    Il file da cui attinge i dati (nome, cognome,anno di nascita,matricola,voto) è un normalissimo studenti.txt nel quale ho inserito delle righe random così:

    Alberto Mannucci 1983 35789 21
    Giovanni Maccioni 1983 35432 30
    Giorgio Mameli 1981 36837 28
    Luca Pischedda 1981 33654 23
    Giovanni Frigau 1983 32987 29
    Francesca Barbarossa 1983 34789 30

    codice:
    #include <malloc.h>      
    #include <stdio.h>     
    #include <stdlib.h>  
    #include <limits.h> 
    struct studente { char *nome;
                      char *cognome;
                      int anno;
                      int matricola;
                      int voto;};
    typedef struct studente STUDENTE;
    
    
    typedef struct Cell CELL;
    struct Cell {STUDENTE studente;
                 CELL *next;};
    
    
    CELL *crealista2(char *nomefile);
    void visualizzalista(CELL *p);
                 
    main()
    {
          int numstud;
          CELL *list;
          list=crealista2("studenti.txt"); //crea la lista e prende i dati dal file
          printf("\n\n");
          visualizzalista(list);
          printf("\n\n");
          system("pause");
               
    }
    
    CELL *crealista2(char *nomefile)
    {
         int i=0;
         CELL *p, *paus;
         FILE *fp;
         fp=fopen(nomefile,"r");
         p=(CELL *)malloc(sizeof(CELL)); /* creo la lista e p sarà il puntatore al primo elemento */
         p->studente.nome=(char *)malloc(30*sizeof(char)); /* è corretto allocare dinamicamente questa memoria se prima l'ho gia allocata per la strutura CELL, del quale questo campo fa parte?..Non è come se stessi "ingrandendo" il sizeof(CELL) ? */
         fscanf(fp,"%s", &p->studente.nome);
         p->studente.cognome=(char *)malloc(30*sizeof(char));
         fscanf(fp,"%s", &p->studente.cognome);
         fscanf(fp,"%d", &p->studente.anno);
         fscanf(fp,"%d", &p->studente.matricola);
         fscanf(fp,"%d", &p->studente.voto);
         paus=p;
         i++;
         // creo le celle successive
         while(!feof(fp)) { 
                          paus->next=(CELL *)malloc(sizeof(CELL));
                          paus=paus->next;
                          paus->studente.nome=(char *)malloc(30*sizeof(char));
                          fscanf(fp,"%s", &paus->studente.nome);
                          paus->studente.cognome=(char *)malloc(30*sizeof(char));
                          fscanf(fp,"%s", &paus->studente.cognome);
                          fscanf(fp,"%d", &paus->studente.anno);
                          fscanf(fp,"%d", &paus->studente.matricola);
                          fscanf(fp,"%d", &paus->studente.voto);
                          i++;                                         
                          }  
         paus->next=NULL;
                      
         fclose(fp);
         printf("\n\n Hai inserito %d elementi non nulli\n\n",i);
    return (p);
    }
    
    void visualizzalista(CELL *p) // p=list
    {
         
           printf("\nVisualizzazione lista inserita:\n\n");    
           printf("\n list----> ");
           while(p!=NULL){
                          // printf("\n\t %s", p->studente.nome); <---se levate gli slash del commento vedrete che crasha 
                          // printf("\n\t %s", p->studente.cognome);
                          printf("\n\t %d", p->studente.anno);
                          printf("\n\t %d", p->studente.matricola);
                          printf("\n\t %d", p->studente.voto);
                          printf("\n---->");
                          p=p->next; //p punta il PROSSIMO elemento della lista   
                          }
            printf("NULL\n\n");
    }

  2. #2
    ..mi ha tagliato un commento, quello che inizia con "/* è corretto..."

    lo riporto per intero qua, era una domanda che volevo farvi:

    /* è corretto allocare dinamicamente questa memoria se prima l'ho gia allocata per la struttura CELL, del quale questo campo fa parte?..Non è come se stessi "ingrandendo" il sizeof(CELL) ? */

    ..l'altro che miha tagliato è:

    <---se levate gli slash del commento e lo eseguite compilando queste 2 righe vedrete che crasha, senza di esse invece funziona

  3. #3
    Sintetizzando le domande insomma i quesiti sono:

    1) è corretto come ho memorizzato la stringa (presa dal file) nel campo nome e cognome della struttura ? ..Pure la storia dell'allocazione dinamica della memoria ? (prima fatta per la cell e poi e poi per i campi nome e cognome in essa contenuti)

    2) è corretto come dico al codice di stampare il contenuto di *nome e *cognome ?


    Ecco così è tutto bello conciso,
    Grazie mille!

  4. #4

    Re: [C] stampare da printf con puntatore a char

    fscanf(fp,"%s", &p->studente.cognome);
    è sbagliato:
    codice:
       fscanf(fp,"%s", p->studente.cognome);
    corretto

    poi se programmi in C puoi evitare di usare i commenti C++ //.
    Perfavore scrivi int main al posto di main, e alla fine mettici un bel return 0, ok?

  5. #5
    Grandioso funzionaaaaaaaaaaaa

    GRAZIE MILLE

    Ho apportato le correzioni suggerite

    se scrivo:

    int main()

    le parentesi () sottintendono void ?

  6. #6
    Originariamente inviato da bluelettrico
    Grandioso funzionaaaaaaaaaaaa

    GRAZIE MILLE

    Ho apportato le correzioni suggerite

    se scrivo:

    int main()

    le parentesi () sottintendono void ?
    già sarebbe anche bello se mettessi int main(void)

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 © 2024 vBulletin Solutions, Inc. All rights reserved.