Der %f
Konvertierungsspezifizierer sagt scanf
Eingang aufhören zu lesen, sobald es ein Zeichen sieht, die nicht Teil einer juristischen Gleitkommazahlen konstant ist (dh etwas, das keine Ziffer, Komma, oder unterschreiben). Dieses schlechte Zeichen wird im Eingabestrom gelassen, so dass der nächste Aufruf an scanf
fehlschlägt, und der nächste, und der nächste, usw.
Sie sollten immer den Rückgabewert von scanf
überprüfen - es wird Ihnen sagen, wie viele Elemente waren erfolgreich aus dem Eingabestream gelesen und zugewiesen. In diesem Fall erwarten Sie ein einzelnes Element, daher sollten Sie einen Rückgabewert von 1 erhalten. Wenn Sie einen Rückgabewert von 0 erhalten, bedeutet dies, dass die Eingabe kein richtiger Fließkommawert ist und dass eine fehlerhafte Eingabe erforderlich ist irgendwie geklärt werden. Hier ist eine mögliche Lösung:
if (scanf("%f", &minutes) == 1)
{
// process minutes as normal
}
else
{
// clear everything up to the next whitespace character
while (!isspace(getchar()))
; // empty loop
}
Das einzige Problem dabei ist, dass scanf
Art stumm ist, und wenn Sie so etwas wie 123fgh
geben, wird es konvertieren und die 123
zuweisen, während fgh
in dem Eingangsstrom zu verlassen; Sie würden wahrscheinlich die gesamte Eingabe komplett ablehnen.
Eine Lösung ist die Eingabe als Text zu lesen, und es dann strtod
mit konvertieren:
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
}
}
Dies den Vorteil nicht Mist in dem Eingangsstrom verlassen hat.
Was haben Sie mit diesem Programm vor? Was meinst du mit negativen und positiven Minuten? – user3078414
Beachten Sie, dass 'scanf' nicht der sicherste Weg ist, um Eingaben zu erhalten, vor allem, da Sie mit den verschiedenen Eingabemöglichkeiten umgehen möchten. Siehe die akzeptierte Antwort [hier] (http://stackoverflow.com/questions/2430303/disadvantages-of-scanf) – iRove
Warum wird der Titel so formuliert, als wäre das ein Fehler in C? – cat