PDA

Visualizza la versione completa : Problema con campo char in struct


Ghemon-a
22-12-2011, 17:51
Salve a tutti,
quando compilo il seguente codice non viene riportato alcun errore ma al momento dell'esecuzione riesco solo ad inserire i dati relativi al nome e l'età, infatti il comando scanf per assegnare un valore alla variabile iniziale non viene eseguito, quindi vengono stampati solo i dati relativi al nome e l'età


#include <stdio.h>

typedef struct persona
{
char nome[10];
int eta;
char iniziale;
}persona;

void leggi(persona *p);
void vis(persona *p);

int main(void)
{
persona ale;
leggi(&ale);
vis(&ale);
}

void leggi(persona *p)
{
scanf("%s%i%c",p->nome,&p->eta,&p->iniziale);
}
void vis(persona *p)
{
printf("%s %i %c",p->nome,p->eta,p->iniziale);
}

ramy89
22-12-2011, 18:34
Per cosa sta il %i ? Non dovresti usare %d per prendere in input/ stampare gli interi?

Ghemon-a
22-12-2011, 18:54
Originariamente inviato da ramy89
Per cosa sta il %i ? Non dovresti usare %d per prendere in input/ stampare gli interi?
Anche %i si usa per gli interi

jappoz
22-12-2011, 19:12
void leggi(persona *p)
{ scanf("%s%i%c",p->nome,&p->eta,&p->iniziale);
}

scusa ma perchè in eta e iniziale metti il reference?

Shika
22-12-2011, 19:16
scanf("%s%i",p->nome,&p->eta);
fflush(stdin);
scanf("%c",&p->iniziale);

prova così

ramy89
22-12-2011, 19:21
Modificala così:


scanf("%s\n%i\n%c",p->nome,&p->eta,&p->iniziale);

Perchè tu in input non prendi solo una stringa e due interi, ma anche i caratteri newline.
Ti suggerisco di usare sempre fgets per l' input, ti faccio un esempio:


char buffer[100];
int a;
float b;
double c;
printf("Inserire un intero: ");
fgets(buffer,100,stdin);
a=atoi(buffer);
printf("Inserire un float: ");
b=(float)atof(buffer);
printf("Inserire un double: ");
c=atof(buffer);

Atof e atoi convertono da stringa a intero solo se possibile, se te ad esempio insrisci caratteri invece che numeri non vengono conteggiati.
http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

Ghemon-a
22-12-2011, 19:25
Originariamente inviato da jappoz

void leggi(persona *p)
{ scanf("%s%i%c",p->nome,&p->eta,&p->iniziale);
}

scusa ma perchè in eta e iniziale metti il reference?

Eta è un int quindi uso &...per quanto riguarda la variabile iniziale ( char) non sono sicuro, ma se non sbaglio ci vuole il reference anche li.

Shika, vorrei capire perchè non funziona in questo caso, non usare un altro tipo di istruzione

ramy89
22-12-2011, 19:35
Non funziona perchè ogni volta che prendi i caratteri in input con la scanf leggi anche i '\n' che digiti,ripeto:


scanf("%s\n%i\n%c",p->nome,&p->eta,&p->iniziale);

Ghemon-a
22-12-2011, 20:56
Originariamente inviato da ramy89
Non funziona perchè ogni volta che prendi i caratteri in input con la scanf leggi anche i '\n' che digiti,ripeto:


scanf("%s\n%i\n%c",p->nome,&p->eta,&p->iniziale);


Grazie ! Mi riferivo proprio a questo ! Quindi acquisiva come carattere \n ?

ramy89
22-12-2011, 20:59
Originariamente inviato da Ghemon-a
Grazie ! Mi riferivo proprio a questo ! Quindi acquisiva come carattere \n ?

Si, in questo modo lo legge senza memorizzarlo, lo "salta" .

Loading