L'identificatore %f
conversione dice scanf
a smettere di leggere in ingresso non appena vede un personaggio che non fa parte di una virgola mobile legale costante (vale a dire, qualcosa che non è una cifra, punto decimale, o segno). Il carattere errato viene lasciato nello stream di input, quindi la chiamata successiva a scanf
non riesce e il successivo e il successivo ecc.
È necessario controllare sempre il valore restituito di scanf
- ti dirà quanti elementi sono stati letto e assegnato con successo dal flusso di input. In questo caso, ti aspetti un singolo elemento, quindi dovresti ottenere un valore di ritorno di 1. Se ottieni un valore di ritorno pari a 0, significa che l'input non è un valore in virgola mobile e che l'input errato deve essere chiarito in qualche modo. Ecco una possibile soluzione:
if (scanf("%f", &minutes) == 1)
{
// process minutes as normal
}
else
{
// clear everything up to the next whitespace character
while (!isspace(getchar()))
; // empty loop
}
L'unico problema con questo è che scanf
è una specie di muto, e se si digita qualcosa come 123fgh
, verrà convertito e assegnare la 123
lasciando fgh
nel flusso in entrata; probabilmente vorresti rifiutare completamente quell'intero input.
Una soluzione è quella di leggere l'input come testo, e poi convertirlo con strtod
:
char buffer[BUFSIZE]; // where BUFSIZE is large enough to handle expected input
...
if (fgets(buffer, sizeof buffer, stdin))
{
char *chk; // chk will point to the first character *not* converted; if
// it's anything other than whitespace or the string terminator,
// then the input was not a valid floating-point value.
double tmp = strtod(buffer, &chk);
if (isspace(*chk) || *chk == 0)
{
minutes = tmp;
}
else
{
// input was not a proper floating point value
}
}
Questo ha il vantaggio di non lasciare merda nel flusso di input.
fonte
2016-07-11 17:16:52
Cosa intendi con questo programma? Cosa intendi con minuti negativi e positivi? – user3078414
Si noti che 'scanf' non è il modo più sicuro per ottenere input in primo luogo, specialmente se si vuole gestire le diverse possibilità di input. Vedere la risposta accettata [qui] (http://stackoverflow.com/questions/2430303/disadvantages-of-scanf) – iRove
Perché il titolo è formulato come se si trattasse di un bug in C? – cat