|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Apr 2003
Messaggi: 179
|
[C] fgets() e stdin con input (fantasma) in attesa
Salve a tutti,
sono incappato in uno strano (almeno per me che sono alle prime armi con C) comportamento della funzione fgets. In pratica ho un programma nel quale, dopo aver fatto diverse printf e scanf(e niente altro), decido di usare fgets per leggere una stringa con tanto di spazi dallo stdin. Codice:
void leggiDaConsole(char* buffer)
{
...
if(fgets(buffer, 100, stdin) != NULL)
printf("%s",buffer);
....
}
Aggiungo che se testo la fgets in un programmino per conto suo, funziona perfettamente. Googlando ho trovato questa soluzione Codice:
void leggiDaConsole(char* buffer)
{
/*
* questo pezzo serve a "svuotare" lo stdin da qualcosa che non è ben chiaro da dove venga
*/
char c = getchar();
while(c != '\n' && c!=EOF) c=getchar();
if(fgets(buffer, 100, stdin) != NULL)
printf("%s",buffer);
}
innanzitutto perchè funziona(si mangia il primo \n e poi?) cosa ci facevano quei \n, da dove venivano, se è un inghippo comune, se è capitato solo a me etc. thx
__________________
"The problem with any unwritten law is that you don't know where to go to erase it." Ho trattato positivamente con: quien sabe |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Apr 2003
Messaggi: 179
|
ci sono sviluppi. Ho modificato il codice di cui sopra così:
Codice:
getchar();
//while(c != '\n' && c!=EOF) c=getchar();
if(fgets(buffer, 100, stdin) == NULL)
printf("errore nella lettura da tastiera\n");
__________________
"The problem with any unwritten law is that you don't know where to go to erase it." Ho trattato positivamente con: quien sabe |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
E' quindi ragionevole supporre che il carattere di "a capo" fosse rimasto nel buffer. Quando usi scanf() successive questo carattere non ti dovrebbe dare problemi, poiche' e' ignorato alla stregua di un blank, e la conversione continuera' dal carattere successivo. Ma quando usi la fgets() te lo becchi.
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Ho verificato, sembra che sia proprio cosi', anche secondo il man del mio sistema Unix.
Per prova: Codice:
char str[80];
printf ("Insert an integer: ");
scanf ("%d", &i);
printf ("Inserted: %d\n", i);
printf ("Insert a string: ");
fgets (str, 80, stdin);
printf ("Inserted: %s\n", str);
__________________
In God we trust; all others bring data |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Apr 2003
Messaggi: 179
|
ti ringrazio, sei stato chiarissimo, questa cosa mi ha fatto uscir pazzo per un paio d'ore.
__________________
"The problem with any unwritten law is that you don't know where to go to erase it." Ho trattato positivamente con: quien sabe |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:24.




















