PDA

Visualizza la versione completa : [C] puntatori, funzioni e struct.. dubbi


lucianad
05-09-2010, 21:09
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:


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:



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?

simo_85
05-09-2010, 21:35
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


char *s, array[] = ".....";
s = tail(array);


Sto sbagliando da qualche parte?
Non usare la gets..


#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;
}

YuYevon
05-09-2010, 21:52
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



...
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



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".

simo_85
05-09-2010, 21:59
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.. :fagiano:

lucianad
05-09-2010, 22:05
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

lucianad
05-09-2010, 22:44
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


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:



#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):


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

YuYevon
05-09-2010, 23:24
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



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.

lucianad
05-09-2010, 23:35
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



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?

YuYevon
05-09-2010, 23:51
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).

lucianad
06-09-2010, 00:07
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:



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 :)

Loading