Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 27
  1. #1

    [C] puntatori, funzioni e struct.. dubbi

    Ciao a tutti ho due domande da porre su alcune cose che non ho davvero capito.
    La prima è:
    devo realizzare una funzione char *tail(char stringa[]) che restituisca come parametro la stringa stessa meno il primo carattere.
    Non ho capito come si fa a richiamare questa funzione nel main.

    La second è:
    devo definire una variabile struct che consenta di immagazzinare nome, cognome e numero di matricola di uno studente.
    Io ho definito la struttura in questo modo:
    codice:
    struct studente {
    
        char cognome[20];
        char nome[20];
        int matricola;
    
        }persona;
    Dato che sul Deitel&Deitel le strutture sono spiegate veramente malissimo e che non ho trovato un esempio simile da nessuna parte (negli esempi che sono riuscita a trovare i dati relativi allo studente erano già dichiarati all'interno del programma, mentre in questo li dovrei inserire io da tastiera) mi chiedo come si possa richiamare la struttura nel main e immagazzinare i dati.
    Mi spiego meglio: io ho capito che la variabile persona ha la stessa struttura di studente, quindi nel main dovrei scrivere una cosa del genere per poter immettere i dati all'interno dei vettori dichiarati nella struct:

    codice:
    printf("Inserire nome: ");
        gets(nome.persona);
        printf("Inserire cognome: ");
        gets (cognome.persona);
        printf("Inserire numero di matricola");
        gets(matricola.persona);
    Sto sbagliando da qualche parte?
    Entropia è quella cosa per cui non si riesce a rimettere il dentifricio nel tubo.
    -W.Allen-
    Non sono pigro..vivo a basso consumo energetico -anonimo-

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466

    Re: [C] puntatori, funzioni e struct.. dubbi

    Originariamente inviato da lucianad
    devo realizzare una funzione char *tail(char stringa[]) che restituisca come parametro la stringa stessa meno il primo carattere.
    Non ho capito come si fa a richiamare questa funzione nel main.
    Se il problema si tratta solo di richiamarla
    codice:
    char *s, array[] = ".....";
    s = tail(array);
    Sto sbagliando da qualche parte?
    Non usare la gets..
    codice:
    #include <stdio.h>
    
    struct person
    {
       char name[20];
       char surname[20];
       int number;
    };
    
    int main(void)
    {
       struct person student;
    	
       printf("Insert name: ");
       scanf("%s", student.name); 
       ....
    
       printf("%s\n", student.name);
    
       return 0;
    }

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Oddio simo_85 se usi la scanf() in quel modo tanto vale ricorrere alla gets()
    Piuttosto si deve usare la fgets() oppure con la scanf() è meglio specificare nel codice di formato %s la lunghezza massima del buffer

    codice:
    ...
    char buffer[11];
    
    scanf("%10s", buffer);
    ...
    in questo modo eventuali caratteri in eccesso vengono troncati e non si ha buffer overflow.

    Per quanto riguarda il problema di lucianad, basta capire che nel momento in cui si definisce una struttura

    codice:
    struct qualcosa {
       /* primo campo */
       /* secondo campo */
       ...
       /* n-esimo campo */
    };
    si sta dichiarando un tipo di dato (strutturato, ma questo non importa). E' un tipo di dato, quindi dichiarare "struct qualcosa qualcosa1" è come dichiarare "int qualcosa1", con la differenza che nel secondo caso si sta ricorrendo ad un tipo di dato primitivo mentre nel secondo ad un tipo definito dal programmatore.

    Le struct, nella fattispecie, sono da considerare come "contenitori", quindi la scrittura

    nome_struttura.nome_campo

    (o con l'operatore -> nel caso in cui nome_struttura sia un puntatore) serve ad accedere ad un campo specifico "contenuto" in questo contenitore.

    L'errore tuo è che hai invertito le due cose, scrivendo ad esempio "nome.persona" anziché "persona.nome".
    every day above ground is a good one

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Originariamente inviato da YuYevon
    Oddio simo_85 se usi la scanf() in quel modo tanto vale ricorrere alla gets()
    Piuttosto si deve usare la fgets() oppure con la scanf() è meglio specificare nel codice di formato %s la lunghezza massima del buffer
    Azzo hai ragione, che sbadato, come sempre..

  5. #5
    ora provo e poi vediamo se riesco.
    ho un esame la settimana prossima e sono nella cacca fino al collo.
    dio quanto odio il C!!

    nel frattempo, grazie dell'aiuto

    Luciana
    Entropia è quella cosa per cui non si riesce a rimettere il dentifricio nel tubo.
    -W.Allen-
    Non sono pigro..vivo a basso consumo energetico -anonimo-

  6. #6
    sono riuscita a inserire nome cognome e numero di matricola .
    ora c'è un modo per visualizzare l'output con tutti i record registrati?
    ad esempio , se io ho inserito
    tizio
    cazio
    123456

    e voglio visualizzare
    tizio
    caio
    123456

    riesco a farlo solo se uso
    codice:
    puts(persona.nome);
    puts(persona.cognome);
    puts(persona.matricola);
    non so se mi sono spiegata bene,ma non si può usare puts con un'unica riga?

    secondo problema:
    il codice è questo:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct studente{
    
        char cognome[20];
        char nome[20];
        int matricola;
    
        };
    
    
    
    main(){
    
        struct studente persona;
    
        printf("Inserire nome: ");
        gets(persona.nome);
        printf("Inserire cognome: ");
        gets (persona.cognome);
        printf("Inserire numero di matricola: ");
        gets(persona.matricola);
    
    
        puts(persona.nome);
        puts(persona.cognome);
        puts(persona.matricola);
    
    
    
    
    return 0;
    
        }
    l'int mi dà errore e precisamente dice che nel main, nelle righe corrispondenti a gets(persona.matricola); e puts(persona.matricola) ci sono questi due errori (sono gli stessi per le due righe):
    codice:
    error: invalid conversion from ‘int’ to ‘char*’|
    error:   initializing argument 1 of ‘char* gets(char*)’|
    e non ho capito perchè.
    Se definisco nella struct matricola come vettore char invece funziona correttamente.

    Grazie per la pazienza

    Luciana
    Entropia è quella cosa per cui non si riesce a rimettere il dentifricio nel tubo.
    -W.Allen-
    Non sono pigro..vivo a basso consumo energetico -anonimo-

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da lucianad
    non so se mi sono spiegata bene,ma non si può usare puts con un'unica riga?
    Ti sei spiegata ma non è possibile, a meno che non definisci tu una funzione per la stampa dei campi, della serie

    codice:
    void stampa_studente(struct studente *struttura)
    {
       puts(struttura -> nome);
       puts(struttura -> cognome);
       printf("eta %d\n", struttura -> eta);
    }
    e la richiami ogni volta che vuoi.

    Se definisco nella struct matricola come vettore char invece funziona correttamente.
    Ti sei risposta da sola: persona.matricola è un dato di tipo int, quindi non puoi stamparlo con puts() che stampa solo stringhe... devi ricorrere alla printf() col codice di formato %d, come ho scritto nella funzione di sopra.
    every day above ground is a good one

  8. #8
    Originariamente inviato da YuYevon
    Ti sei spiegata ma non è possibile, a meno che non definisci tu una funzione per la stampa dei campi, della serie

    codice:
    void stampa_studente(struct studente *struttura)
    {
       puts(struttura -> nome);
       puts(struttura -> cognome);
       printf("eta %d\n", struttura -> eta);
    }
    e la richiami ogni volta che vuoi.



    Ti sei risposta da sola: persona.matricola è un dato di tipo int, quindi non puoi stamparlo con puts() che stampa solo stringhe... devi ricorrere alla printf() col codice di formato %d, come ho scritto nella funzione di sopra.
    rinco che sono! è vero! è che è così comodo usare il puts che neanche ci avevo fatto caso!
    grazie!

    Un'ultima domanda: allora, una volta inseriti i dati in modo recursivo (ho usato un ciclo while per farlo), cper stampare l'intera lista, cosa è opportuno usare? Cioè se inserisco i dati di 10 studenti, per visualizzarli tutti?
    Entropia è quella cosa per cui non si riesce a rimettere il dentifricio nel tubo.
    -W.Allen-
    Non sono pigro..vivo a basso consumo energetico -anonimo-

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da lucianad
    Un'ultima domanda: allora, una volta inseriti i dati in modo recursivo (ho usato un ciclo while per farlo), cper stampare l'intera lista, cosa è opportuno usare? Cioè se inserisco i dati di 10 studenti, per visualizzarli tutti?
    Se hai inserito i dati con un ciclo while lo hai fatto iterativamente, non ricorsivamente... comunque per stamparli basta che metti la chiamata alla funzione di prima per la stampa in un'ulteriore ciclo iterativo che scorre tutto l'array delle strutture che devi gestire, e per ogni iterazione avrai semplicemente "stampa_studente(array[i]);" con i che va da 0 a 9 (se, come dici, le strutture sono 10).
    every day above ground is a good one

  10. #10
    Originariamente inviato da YuYevon
    Se hai inserito i dati con un ciclo while lo hai fatto iterativamente, non ricorsivamente...
    :P pardon, il senso era quello però

    comunque per stamparli basta che metti la chiamata alla funzione di prima per la stampa in un'ulteriore ciclo iterativo che scorre tutto l'array delle strutture che devi gestire, e per ogni iterazione avrai semplicemente "stampa_studente(array[i]);" con i che va da 0 a 9 (se, come dici, le strutture sono 10).
    ma io non so in anticipo quanti dati verranno inseriti, 10 era un esempio.. posto il pezzo con il while:

    codice:
    while((c=getchar()) != '\n'){
    
       
        gets(persona.nome);
        printf("Inserire cognome: ");
        gets (persona.cognome);
        printf("Inserire numero di matricola: ");
        gets(persona.matricola);
        printf("Inserire nome: ");
        }
    quindi fino a che non dò lo stop continuo a inserire dati,... una volta finito , dovrei stamparli tutti.. ecco cosa non mi torna
    Entropia è quella cosa per cui non si riesce a rimettere il dentifricio nel tubo.
    -W.Allen-
    Non sono pigro..vivo a basso consumo energetico -anonimo-

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.