|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6790
|
[C] Buffer lettura scanf
Vorrei riempire delle strutture dinamiche inserendo input da tastiera. Quindi faccio un uso misto delle scanf e di fgets, quest'ultima per gestire input con spazi. Solo che la scanf mi dà problemi, in quanto non svuota il buffer:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct record_lista
{ char nome[20];
char cognome[20];
char indirizzo[20];
int numero_civico;
};
typedef struct record_lista persona;
int main(void){
int dimension;
int i;
printf("Inserisci la dimensione: \n");
scanf("\n%d",&dimension);
persona*array_din=(persona*)malloc(sizeof(persona)*dimension);
i=0;
for(i;i< dimension;i++) {
printf("Entry numero: %d \n", i+1);
printf("Inserisci il nome: \n");
scanf("\n%d",&array_din[i].nome);
printf("Inserisci il cognome: \n");
scanf("\n%d",&array_din[i].cognome);
printf("Inserisci l'indirizzo: \n");
fgets(&array_din[i].indirizzo,sizeof(array_din[i].indirizzo),stdin);
printf("Inserisci il numero civico: \n");
scanf("\n%s",&array_din[i].indirizzo);
}
i=0;
for(i;i< dimension;i++) {
printf("Entry numero: %d \n", i+1);
printf("Nome: %s\n",&array_din[i].nome);
printf("Cognome: %s\n",&array_din[i].cognome);
printf("Indirizzo: %s\n",&array_din[i].indirizzo);
printf("Numero civico: %d\n",&array_din[i].numero_civico);
}
}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2006
Città: Mantova
Messaggi: 468
|
metodo casalingo:
dopo la scanf: while(getchar()!='\n'); legge nel buffer fino a che trova un invio |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6790
|
Mm, ma con getchar non si mette in attesa di un ulteriore immissione dell'utente? Poi non capisco perché non funziona con il "\n" nella scanf. Comunque, facendo come suggerisci , funziona.
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2006
Città: Mantova
Messaggi: 468
|
Quote:
i caratteri inseriti da tastiera vanno tutti in stdin quindi con la getchar() vai a utilizzare lo stesso buffer della scanf. Ultima modifica di ..::DAVE::.. : 09-05-2008 alle 17:44. |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Codice:
NAME
fflush - flush a stream
SYNOPSIS
#include <stdio.h>
int fflush(FILE *stream);
DESCRIPTION
The function fflush() forces a write of all user-space buffered data
for the given output or update stream via the stream's underlying write
function. The open status of the stream is unaffected.
If the stream argument is NULL, fflush() flushes all open output
streams.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6790
|
Quote:
|
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Uh hai ragione lo stream è in input!
Due sviste in due giorni... no no, dovrò leggere meglio i messaggi prima di rispondere d'ora in poi...
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6790
|
OK, però non capisco: la getchar trova il carattere di a capo nel buffer ed esce dal ciclo, che è quello che ha lasciato la scanf precedente, se ho capito bene. E poi? Chi lo svuota il buffer? Sempre la getchar?
|
|
|
|
|
|
#9 | |
|
Member
Iscritto dal: Aug 2007
Messaggi: 50
|
Quote:
Codice:
fflush(stdin); Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct record_lista
{ char nome[20];
char cognome[20];
char indirizzo[20];
int numero_civico;
};
typedef struct record_lista persona;
int main(void){
int dimension;
int i;
printf("Inserisci la dimensione: \n");
scanf("\n%d",&dimension);
persona*array_din=(persona*)malloc(sizeof(persona)*dimension);
i=0;
for(i;i< dimension;i++) {
printf("Entry numero: %d \n", i+1);
printf("Inserisci il nome: \n");
gets(array_din[i].nome); /*è una stringa, non un intero*/
printf("Inserisci il cognome: \n");
gets(array_din[i].cognome);
printf("Inserisci l'indirizzo: \n");
gets(array_din[i].indirizzo);
printf("Inserisci il numero civico: \n");
scanf("\n%d",&array_din[i].indirizzo); /*qui invece è un intero, non una stringa*/
}
i=0;
for(i;i< dimension;i++) {
printf("Entry numero: %d \n", i+1);
printf("Nome: %s\n",array_din[i].nome); /*nella printf non si usa la & */
printf("Cognome: %s\n",array_din[i].cognome);
printf("Indirizzo: %s\n",array_din[i].indirizzo);
printf("Numero civico: %d\n",array_din[i].numero_civico);
}
free(array_dyn);
return 0;
}
Ultima modifica di dreadknight : 09-05-2008 alle 22:31. |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
No, leggi su, è contro gli standards, ha ragione. Otterresti un comportamento indefinito, è implementata "per funzionare" solo dal compilatore C della Microsoft. Al massimo può leggere fino alla fine o con scanf("%*s"); finché non riceve più nulla.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Nov 2006
Città: Mantova
Messaggi: 468
|
Quote:
il buffer avrà sempre i dati di prima ma quello che da fastidio alle scanf è il \n |
|
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Aug 2007
Messaggi: 50
|
c'erano degli errori nel codice, penso di aver corretto tutto. Ora bisogna solo compilare e vedere se funziona
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6790
|
Quote:
Ultima modifica di Unrue : 10-05-2008 alle 12:34. |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6790
|
Ma se la getchar legge il '\n' senza toglierlo dal buffer, una eventuale scanf successiva non si ritrova con lo stesso problema?
Ultima modifica di Unrue : 10-05-2008 alle 12:39. |
|
|
|
|
|
#15 |
|
Member
Iscritto dal: Aug 2007
Messaggi: 50
|
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Nov 2006
Città: Mantova
Messaggi: 468
|
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6790
|
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6790
|
Dunque, quindi la scanf legge la stringa immessa e si ferma al '\n', solo che non fa avanzare il puntatore del buffer alla posizione successiva, quindi la scanf dopo continua a leggerlo? Invece il getchar legge il '\n' ma avanza il puntatore. Credo sia così.
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Nov 2006
Città: Mantova
Messaggi: 468
|
esatto
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Nov 2002
Messaggi: 6790
|
Trallaltro, sempre una cosa che non ricordo legato a questo esempio: sia la printf che la scanf prendono in ingresso un puntatore a char. Come mai allora nella printf non ci va il & e nella scanf si, quando si passano i parametri?
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:40.




















