Prorad
27-05-2008, 22:47
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.
void leggiDaConsole(char* buffer)
{
...
if(fgets(buffer, 100, stdin) != NULL)
printf("%s",buffer);
....
}
Tuttavia mandando in esecuzione il programma, sostanzialmente la fgets viene "saltata" nel senso che per qualche strano motivo è come se nello stdin ci fossero due o tre(non di più) \n in attesa (che però non riesco a capire da dove diavolo possano venire) che vengono interpretati dalla funzione come fine dell'input, e mi restituiscono una stringa vuota con il solo \n.
Aggiungo che se testo la fgets in un programmino per conto suo, funziona perfettamente.
Googlando ho trovato questa soluzione
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);
}
per svuotare lo stdin. Effettivamente funziona, però mi piacerebbe capire
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
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.
void leggiDaConsole(char* buffer)
{
...
if(fgets(buffer, 100, stdin) != NULL)
printf("%s",buffer);
....
}
Tuttavia mandando in esecuzione il programma, sostanzialmente la fgets viene "saltata" nel senso che per qualche strano motivo è come se nello stdin ci fossero due o tre(non di più) \n in attesa (che però non riesco a capire da dove diavolo possano venire) che vengono interpretati dalla funzione come fine dell'input, e mi restituiscono una stringa vuota con il solo \n.
Aggiungo che se testo la fgets in un programmino per conto suo, funziona perfettamente.
Googlando ho trovato questa soluzione
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);
}
per svuotare lo stdin. Effettivamente funziona, però mi piacerebbe capire
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