Es soll unter Linux ein double Wert per Tastatur eingegeben werden und das führt zu Problemen
-
Komisch. Bei deiner "Lösung" muss ich bevor ich eine
double
eingeben kann einmal Enter drücken?? und wenn ich dannEOF
eingebe, komm ich trotzdem aus der Schleife, ohne einedouble
eingegeben zu haben?
-
sscanf Problem schrieb:
So funktioniert es:
// Variante 2: double eingabe_variante_2(){ double input; int c; do { c; // int c, nicht char c. while ((c = getchar()) != EOF && c != '\n'); // das ist jetzt mein flush() } while (!scanf("%lf",&input)); return input; }
Ich muss mich korrigieren, es funktioniert nicht, wenn gleich am Anfang eine Zahl richtig eingegeben wurde.
Habe es in:
// Variante 2: double eingabe_variante_2(){ double input; int c; do { c; // int c, nicht char c. while ((c = getchar()) != EOF && c != '\n'); // Dies funktioniert im Gegensatz zu fflush(stdin) // } while (!scanf("%lf",&input)); } while (1 != scanf("%lf",&input)); // } while (1 != scanf("%lf%*[^\n]",&input)); return input; }
und
// Variante 2: double eingabe_variante_2(){ double input; int c; do { c; // int c, nicht char c. while ((c = getchar()) != EOF && c != '\n'); // Dies funktioniert im Gegensatz zu fflush(stdin) // } while (!scanf("%lf",&input)); // } while (1 != scanf("%lf",&input)); } while (1 != scanf("%lf%*[^\n]",&input)); return input; }
geändert, aber bei beiden Varianten existiert der Fehler, dass man die Zahl, wenn sie am Anfang richtig eingegeben wurde, noch einmal eingeben muss.
Variante 2 ist somit immer noch ungelöst.
Wenn auch der erste Bug, dass das Programm nicht mehr weitergeht, sobald irgendetwas anderes als eine Zahl eingegeben wurde, bei beiden modifizierten Varianten nicht mehr vorkommt.
-
Swordfish schrieb:
Komisch. Bei deiner "Lösung" muss ich bevor ich eine
double
eingeben kann einmal Enter drücken??Ja, das ist leider der neue Bug, der betrifft aber alle Modifikationen von Variante 2.
Also egal welches man davon nimmt:
} while (!scanf("%lf",&input)); } while (1 != scanf("%lf",&input)); } while (1 != scanf("%lf%*[^\n]",&input));
Der Fehler trifft bei allen auf.
Sowohl wenn man zuerst ENTER eingibt oder eine ZAHL, also richtig, eingibt, muss man die eigentliche Zahl noch einmal geben.Lediglich der andere Bug, dass es gar nicht mehr weitergeht, wenn man einen Buchstaben oder ENTER zuerst eingegeben hat ist jetzt weg.
-
Dann mach eine while-Schleife (das do muss weg).
-
Wie wäre es, wenn du dich von der Vorstellung zwei Varianten zu brauchen verabschiedest und stattdessen die logische Vorgehensweise
- Leseversuch
- wenn Fehler:
-- Fehlerbehandlung
anwendest?
-
Swordfish schrieb:
Wie wäre es, wenn du dich von der Vorstellung zwei Varianten zu brauchen verabschiedest und stattdessen die logische Vorgehensweise
- Leseversuch
- wenn Fehler:
-- Fehlerbehandlung
anwendest?Das ist doch gar nicht das Thema.
Variante 1 funktioniert, ich könnte diese also nehmen.
Aber Variante 2 funktioniert noch nicht.
Was bitteschön ist jetzt falsch daran zu untersuchen warum sie nicht geht und sie entsprechend zu modifizieren bis sie geht?Variante 1 verwendet sscanf, Variante 2 scanf, das ist schon ein großer Unterschied und vielleicht braucht man mal das eine oder das andere.
Bisher existiert aber nur eine funktionierende Lösung für sscanf.
Die für scanf muss erst noch gefunden werden.@DirkB
Werde ich noch testen.
-
Okay, die while(){} Variante ohne do geht:
// Variante 3: double eingabe_variante_3(){ double input; int c; while (1 != scanf("%lf",&input)){ // while (1 != scanf("%lf%*[^\n]",&input)) { // <- das war nicht nötig c; // int c, nicht char c. while ((c = getchar()) != EOF && c != '\n'); // Dies funktioniert im Gegensatz zu fflush(stdin) } return input; }
-
sscanf Problem schrieb:
Okay, die while(){} Variante ohne do geht:
Und das ist genau:
Swordfish schrieb:
- Leseversuch
- wenn Fehler:
-- FehlerbehandlungWas meinst du, was Zeile 7 macht?
Die schleppst du jetzt schon ein paar Versionen mit dir rum.
-
DirkB schrieb:
Was meinst du, was Zeile 7 macht?
Steht doch im Kommentar daneben!?
-
Was noch geht, ohne extra Variable oder Puffer:
while (1 != scanf("%lf", &input)) scanf("%*[^\n]"); // im Fehlerfall alles bis zum '\n' überlesen scanf("%*[^\n]"); // evtl Rest bis zum '\n' überlesen
Der Versuch, das mit einem
scanf
zu machen geht nicht, dascanf
mit dem einlesen aufhört, wenn es auf einen Fehler trifft.
-
Swordfish schrieb:
DirkB schrieb:
Was meinst du, was Zeile 7 macht?
Steht doch im Kommentar daneben!?
Oh! Äh, ja.
Aber was bewirkt sie wirklich.