PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ cin.get() wartet nicht auf Enter.


Geldmann3
2012-06-10, 18:00:40
Nur aus Interesse, habe folgenden Code in Microsoft Visual C++ ausgeführt.

#include <iostream>
using namespace std;

int main()
{
int GanzeZahl;
cout << "Gebe nun deine Zahl ein: ";
cin >> GanzeZahl;
cout << "Deine eingegebene Zahl war " << GanzeZahl << endl;
cin.get();
}

Das ganze sollte sich jetzt doch erst schliessen, nachdem ich Enter drücke, doch es schließt sich direkt nach der Ausgabe. Nur wenn ich nochmal cin.get(); einfüge bleibt es offen. Warum? Frisst das erste cin.get(); etwa mein Enter von der Zahleneingabe noch mit, weil es zu schnell geht?

Coda
2012-06-10, 18:25:48
Starte ohne Debugger oder setz einen Breakpoint auf die letzte Zeile.

Nakai
2012-06-10, 18:57:12
Mach mal nen Flush auf den Inputbuffer.

#include <iostream>
#include <stdio.h>

using namespace std;

int main()
{
int GanzeZahl;
cout << "Gebe nun deine Zahl ein: ";
cin >> GanzeZahl;
cout << "Deine eingegebene Zahl war " << GanzeZahl << endl;
fflush( stdin );
cin.get();
}


Grund: Da liegt wohl noch ein \r im Inputstream.

Coda
2012-06-10, 19:03:33
Nö.

Nakai
2012-06-10, 19:06:26
Nö.

Was dann?

randy
2012-06-11, 09:11:30
Mir fällt auf, dass die Methode einen int Rückgabewert erwartet. Der fehlt im Programmcode oben.

Btw, Lösung gibt's evtl. hier http://stackoverflow.com/questions/8151548/cin-get-is-non-blocking

anakin87
2012-06-11, 15:48:08
Hm ich hatte mal ein ähnliches Problem - da war in einer Schleife ein cin das wiederholt abgearbeitet wurde und beim 2. Lauf nahm er neue Eingaben nicht an. Bei mir war das Problem, dass der Buffer nicht sauber war und Mist aus dem Buffer ins Array geschrieben hat, anstelle der "neuen" Werte. Ich konnte es dann mit cin.clear() und cin.ignore() lösen. Mit clear das Flag setzen und mit ignore den Buffer überspringen bis \n sollt ca. so gehen...


#include <limits.h>
...
...
cin.clear();
cin.ignore(INT_MAX,'\n');
cin.getline("Array","Länge");
....

Arrayname und Länge sind dann noch anzupassen - ich hoffe das hilft

Geldmann3
2012-06-11, 21:55:48
Das scheint sehr oft zu passieren, beispielsweise hier
#include <iostream>
using namespace std;

int main()
{
int i;
cin >> i;
if(i) {
cout << "Der Benutzer hat einen Wert ungleich 0 eingegeben";
cin.get();
}}

anakin87
2012-06-12, 09:16:36
Ja ich find es seltsam - aber mir wurde es auch nicht richtig erklärt was es da hat.
Nur dass anscheinend der Buffer vom Input nicht "sauber" ist - somit muss man das clear-Flag setzen und alle Zeichen bis zum \n überspringen.

Hab deinen Code ausprobiert und ja er überspringt mit das 2. cin...
So funktionierts bei mir aber (unter Linux)

#include <iostream>
#include <limits.h>

using namespace std;

int main()
{
int i;
cin >> i;
if(i) {
cout << "Der Benutzer hat einen Wert ungleich 0 eingegeben";
cin.clear();
cin.ignore(INT_MAX,'\n');
cin.get();
}}


Unter windows weis ich es nicht - bei C gabs mal das fflush wie oben genannt, aber k.A. ob das funktioniert.

EDIT: kann aber gut sein, dass das cin.ignore(INT_MAX,'\n'); ein schlechtes Laufzeitverhalten mit sich bringt - hab ich aber nicht getestet....

Schimmelhans
2012-06-19, 00:55:33
Unter windows weis ich es nicht - bei C gabs mal das fflush wie oben genannt, aber k.A. ob das funktioniert.Das Flushen eines Inputstreams war schon immer undefiniertes Verhalten. Das ist nur für Ausgabestreams gedacht.

Man wird die IDE doch wohl so konfigurieren können, dass sie das Fenster bei einem Konsolenprogramm nicht direkt wieder schließt, ohne dabei das eigene Programm zu modifizieren, oder? Kann doch echt nicht Sinn der Sache sein, da irgendwelche Schwachsinnsanweisungen einzufügen. Codas Breakpointlösung wäre auch noch eine Alternative.

anakin87
2012-06-19, 01:06:54
Ja zum Offenhalten der Konsole ist es nicht unbedingt gedacht, ABER blöd ist echt, dass mehrere aufeinanderfolgende Eingaben per cin manchmal "geschluckt" werden...
Wenn man wiederholt einliest, muss man sich ernsthaft um saubere Buffer kümmern - sauerei, hat lange gedauert bis ich da drauf kommen bin ;D

Coda
2012-06-19, 10:12:08
Was dann?
Hast recht, hab falsch gelesen :usad:

Nakai
2012-06-19, 14:22:07
Hast recht, hab falsch gelesen :usad:

Nee, du hattest recht, dass ich falsch war. Es ist nur ein \n im Buffer, kein \r.
Ich dachte bei Windows würde ein \n\r drinliegen.
Zum Test einfach nur etwas erweitern:


#include <stdio.h>
.
.
.

char j = 0;
cin.get(j);
printf("%d", j);



Es wird 10 ausgegeben und auch nur einmal.