View Full Version : [C] scanf 'ignorate' dopo un CTRL+Z??
Diabolik.cub
03-06-2004, 21:31
ciao a tutti!
ecco il mio problema:
se premo CTRL+Z (ovvero EOF) durante una scanf o gets o simili, tutte le scanf o gets etc.. che seguono nel codice sono bellamente ignorate. Ho provato a bypassare il problema con un fflush(stdin); ma è stato completamente inutile. Come posso fare??
Ecco uno scorcio di programma giusto per rendervi conto.
#include <stdio.h>
main () {
int i = 1;
char str[30];
printf("Inserisci delle stringhe: CTRL+Z per terminare\n");
while (fgets(str, 255, stdin))
printf("stringa n°%d: %s\n", i++, str);
fflush(stdin); //inutile
printf("Inserisci un altra parola: ");
scanf("%s", str); //perchè lo salta??
printf("L'ultima parola è %s", str);
return 0;
}
ciao e grazie a tutti.
hai provato ha ripulire il buffer di input (str) con una memset() subito dopo la fflush()?
memset (str, 0, sizeof (str));
Diabolik.cub
04-06-2004, 18:54
grazie per il tentativo ma purtroppo non funziona nemmeno così
:(
Se devo essere sincero, a me la scanf() sulle stringhe non è mai piaciuta.
Ho sempre preferito usare la gets(), proprio per evitare problemi.
Diabolik.cub
05-06-2004, 01:10
ho paura che il problema sia legato a tutte le funzioni che usano stdin, infatti anche con la gets non funziona!!!
Non so è come se dopo aver premuto CTRL+Z nello stdin si attivasse un flag *mode ignore ON*, e non c'è verso di disattivarlo :(
LukeHack
05-06-2004, 05:51
Originariamente inviato da Diabolik.cub
ciao a tutti!
ecco il mio problema:
se premo CTRL+Z (ovvero EOF) durante una scanf o gets o simili, tutte le scanf o gets etc.. che seguono nel codice sono bellamente ignorate. Ho provato a bypassare il problema con un fflush(stdin); ma è stato completamente inutile. Come posso fare??
Ecco uno scorcio di programma giusto per rendervi conto.
#include <stdio.h>
main () {
int i = 1;
char str[30];
printf("Inserisci delle stringhe: CTRL+Z per terminare\n");
while (fgets(str, 255, stdin))
printf("stringa n°%d: %s\n", i++, str);
fflush(stdin); //inutile
printf("Inserisci un altra parola: ");
scanf("%s", str); //perchè lo salta??
printf("L'ultima parola è %s", str);
return 0;
}
ciao e grazie a tutti.
a me funge! vc++ 6.0 sp6
premo ctrl+z, poi invio
e lui mi chiede l'ultima stringa che stampa...
sotto linux non l'ho provato però
CTRL+Z sugli Unix ha la funzione di EOF... In pratica chiude lo stdin... Su Windows viene semplicemente rilevato come caratttere EOF, ma non credo che faccia la stessa identica funzione...
Infatti se notate su Windows funziona anche senza fflush...
Originariamente inviato da cionci
CTRL+Z sugli Unix ha la funzione di EOF... In pratica chiude lo stdin... Su Windows viene semplicemente rilevato come caratttere EOF, ma non credo che faccia la stessa identica funzione...
Infatti se notate su Windows funziona anche senza fflush...
inoltre lo standard dice che fflush su input da comportamento indefinito
Diabolik.cub
09-06-2004, 21:43
grazie per le risposte!
Scusate per il ritardo ma c'è voluto un po' di tempo per smaltire la trasferta al Mugello :D :cool:
Tornando a noi. Ho visto che alcuni non hanno problemi anche sotto windows, allora ho provato a cambiare compilatore!
Purtroppo non ho Vc++ così ho effettuato prove solo con i 3 che ho a disposizione:
1. Turbo C++ 4.5 for windows: dopo CTRL+Z ignora tutte le funzioni che usano stdin.
2. Borland C++ per dos: dopo CTRL+Z ignora la prima funzione che usa stdin, dalla successiva tutto ok.
3. DevC++ 4.8: nessun problema, funziona alla perfezione!
A questo punto mi sa proprio che è un bug di Turbo C++!
Cmq se al posto di fgets metto
while (scanf("%s", str) != EOF)
le funzioni successive vengono ignorate da tutti i compilatori..
C'è quindi un ulteriore bug da scanf?
Come dicevo...credo che il comportamento non sia ben defnito dallo standard...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.