Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di autior
    Registrato dal
    May 2010
    Messaggi
    17

    Problema con il campo stringa di una struct..

    Salve a tutti! Ho un problema con il seguente programma, ecco la traccia:
    ____
    Scrivere un programma che dato un array di puntatori alla seguente struttura
    struct studente {char *nome; char *cognome; int matricola;};
    ricerchi un dato studente, utilizzando l’algoritmo di ricerca sequenziale.
    ____

    In pratica ricevo un errore nonappena tento di caricare un nome nella prima cella dell'array... Ecco il codice che ho compilato fino ad ora:
    codice:
    #include <stdio.h>
    
    typedef struct {
        char *nome;
        char *cognome;
        int matricola;
    }studente;
    
    void caricamento_arr(studente arr[],int n);
    void visualizza_arr(studente arr[],int n);
    
    studente a[100];
    
    int main () {
        int n, scelta;
        printf("PROGRAMMA PER LA RICERCA DI UNO STUDENTE\n\n\n");
        printf("\nInserire il numero di studenti nella scuola: ");
        scanf("%d",&n);
        caricamento_arr(a,n);
        do {
            printf("\nDigitare:\n[0] Per uscire dal programma.\n[1] Per visualizzare gli alunni.\n[2] Per trovare un'alunno della scuola.\nDigitare la propria scelta: ");
            scanf("%d",&scelta);
            switch (scelta) {
                case 0: break;
                case 1: visualizza_arr(a,n);
                        break;
                case 2: break;
            }
        } while (scelta != 0);
        return 0;
    }
    
    void caricamento_arr(studente arr[], int n) {
        int i;
        printf("\n");
        for (i=0;i<n;i++) {
                printf("Inserire il nome dell'elemento in posizione [%d]: ", i);
                scanf("%s",arr[i].nome);
                printf("Inserire il cognome dell'elemento in posizione [%d]: ", i);
                scanf("%s",arr[i].cognome);
                printf("Inserire la matricola dell'elemento in posizione [%d]: ", i);
                scanf("%d",&arr[i].matricola);
        }
    }
    
    void visualizza_arr(studente arr[], int n) {
        int i;
        printf("\nVisualizzazione degli alunni:\n");
        for (i=0;i<n;i++) printf("Elemento %d - Nome: %s. Cognome: %s. Matricola: %d.\n",i,a[i].nome,a[i].cognome,a[i].matricola);
    }
    Non imparerò mai a usare propriamente le stringhe! Va beh, se qualcuno può chiarirmi i miei errori gliene sarei molto grato!

    EDIT: Ovviamente l'errore è da cercare nella procedura caricamento_arr

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Come si fa a capire che cosa non va se non ci dici che errore ricevi?

    Comunque, se l'array è un array di puntatori, presumo che l'errore sia qualcosa del tipo "type struct studente* has no member called nome" ho qualcosa di simile.

    Questo perchè l'array è un array di puntatori a strutture, e non di strutture. Perciò per accedere ai membri della struttura puntata devi o dereferenziare il puntatore o usare l'operatore ->

    codice:
    void caricamento_arr(studente arr[], int n) {
        int i;
        printf("\n");
        for (i=0;i<n;i++) {
                printf("Inserire il nome dell'elemento in posizione [%d]: ", i);
                scanf("%s",*(arr[i]).nome); 
                printf("Inserire il cognome dell'elemento in posizione [%d]: ", i);
                scanf("%s",arr[i]->cognome); 
                printf("Inserire la matricola dell'elemento in posizione [%d]: ", i);
                scanf("%d",&(arr[i]->matricola)); 
        }
    }
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  3. #3
    Utente di HTML.it L'avatar di autior
    Registrato dal
    May 2010
    Messaggi
    17
    Scusa Ippo, dimenticavo di dire che l'errore che ricevo non viene dal compilatore, ma è un semplice errore di windows... Si presenta non appena digito il nome del primo studente e premo invio!

    Comunque provando con le tue modifiche ricevo dei warning e l'errore di windows rimane.. Ah, se può interessare, uso CodeBlocks.

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Non hai allocato lo spazio per le stringhe.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Utente di HTML.it L'avatar di autior
    Registrato dal
    May 2010
    Messaggi
    17
    Originariamente inviato da Alex'87
    Non hai allocato lo spazio per le stringhe.
    Ah è vero, è così che si faceva! Allora vado a rileggermi come utilizzare Malloc e soci, intanto grazie per l'aiuto.

  6. #6
    Originariamente inviato da autior
    Ah è vero, è così che si faceva! Allora vado a rileggermi come utilizzare Malloc e soci, intanto grazie per l'aiuto.
    se puo esserti di aiuto:

    codice:
    void caricamento_arr(studente arr[], int n) {
        int i;
        printf("\n");
        for (i=0;i<n;i++) {
    	
    			arr[i].nome = malloc(sizeof(char)*15);
                printf("Inserire il nome dell'elemento in posizione [%d]: ", i);
                scanf("%s",arr[i].nome);
    			arr[i].cognome = malloc(sizeof(char)*15);
                printf("Inserire il cognome dell'elemento in posizione [%d]: ", i);
                scanf("%s",arr[i].cognome);
                printf("Inserire la matricola dell'elemento in posizione [%d]: ", i);
                scanf("%d",&arr[i].matricola);
        }
    }

    ovviamente non è perfetto in quanto la lunghezza standard che ho dato per l'allocazione crea sprechi di memoria,cmq ti fai un idea dell'errore che hai fatto.
    Ricordati sempre che oltre ad allocare l'array di struct devi sempre ricordarti di allocare eventuali array dentro la struct. ciao

  7. #7
    Utente di HTML.it L'avatar di autior
    Registrato dal
    May 2010
    Messaggi
    17
    Originariamente inviato da fusionalfa
    se puo esserti di aiuto:

    codice:
    void caricamento_arr(studente arr[], int n) {
        int i;
        printf("\n");
        for (i=0;i<n;i++) {
    	
    			arr[i].nome = malloc(sizeof(char)*15);
                printf("Inserire il nome dell'elemento in posizione [%d]: ", i);
                scanf("%s",arr[i].nome);
    			arr[i].cognome = malloc(sizeof(char)*15);
                printf("Inserire il cognome dell'elemento in posizione [%d]: ", i);
                scanf("%s",arr[i].cognome);
                printf("Inserire la matricola dell'elemento in posizione [%d]: ", i);
                scanf("%d",&arr[i].matricola);
        }
    }

    ovviamente non è perfetto in quanto la lunghezza standard che ho dato per l'allocazione crea sprechi di memoria,cmq ti fai un idea dell'errore che hai fatto.
    Ricordati sempre che oltre ad allocare l'array di struct devi sempre ricordarti di allocare eventuali array dentro la struct. ciao
    Utilissimo fusion, grazie!

    Per chiudere vorrei farvi una domanda che centra poco con il titolo del topic, ma è giusto una curiosità.. non ne ho trovato traccia sul mio libro!

    La domanda è: com'è che, nonostante il campo "nome" sia un puntatore a char, legge correttamente il void * che restituisce la malloc? Cioè, io credevo fosse necessario una cast, ma anche così, com'è stato scritto da fusion, il codice funziona perfettamente..

  8. #8
    Originariamente inviato da autior
    Utilissimo fusion, grazie!

    Per chiudere vorrei farvi una domanda che centra poco con il titolo del topic, ma è giusto una curiosità.. non ne ho trovato traccia sul mio libro!

    La domanda è: com'è che, nonostante il campo "nome" sia un puntatore a char, legge correttamente il void * che restituisce la malloc? Cioè, io credevo fosse necessario una cast, ma anche così, com'è stato scritto da fusion, il codice funziona perfettamente..


    http://it.wikipedia.org/wiki/Malloc

  9. #9
    Utente di HTML.it L'avatar di autior
    Registrato dal
    May 2010
    Messaggi
    17
    Grazie fusion . A quanto pare l'omissione del cast causa incompatibilità con il C++, ma "l'ANSI C definisce una conversione implicita tra il void ed altri tipi", quindi nessun problema.

    La potenza del C!

    Grazie a tutti, potete chiudere.

  10. #10
    Aggiungo un paio di cose:
    in primo luogo, devi ricordarti di liberare tutta la memoria allocata da malloc quando deallochi l'array di strutture; inoltre, usando la scanf in quella maniera rischi di sforare dai buffer appena allocati se l'utente inserisce troppo testo, dovresti limitare i caratteri acquisiti tramite l'apposito specificatore nella stringa di formato o usare una funzione tipo fgets che ti permette di specificare direttamente il limite.
    Amaro C++, il gusto pieno dell'undefined behavior.

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.