Programm blinkt nur kurz auf
-
Gaste schrieb:
das problem ist dass wenn von einer vorherigen eingabe noch ein/mehrere zeichen im tastaturpuffer sind mit cin.get (); nur ein zeichen eingelesen wird -> das programm beendet sich ohne warten aufs enter vom benutzer. Abhilfe schafft das leeren des puffers:
cin.clear (); cin.ignore ( cin.rdbuf ()->in_avail () ); cin.get ();
anstatt eines einfachen cin.get ()
der code schaut nun so aus:
#include<iostream> using namespace std; int main() { cout << "Wie ist denn Heute das Wetter?\n"; cout << "\n"; cout << "g=gut, s=schlecht\n"; char eingabe; cin >> eingabe; if ( eingabe == 'g' ) { cout << "das ist aber schön\n"; cin.clear (); cin.ignore ( cin.rdbuf ()->in_avail () ); cin.get (); } if ( eingabe=='s' ) { cout << "das ist aber schlecht\n"; cin.clear (); cin.ignore ( cin.rdbuf ()->in_avail () ); cin.get (); } }
mfg Gaste
ps: es gibt keine if-schleifen!!! sondern nur if-abfragen
Dein Ansatz ist zwar richtig, aber viel zu umständlich
Pack diese 3 Zeilen doch an den Schluss des Programmes
#include <iostream> using namespace std; int main() { cout << "Wie ist denn Heute das Wetter?\n\n"; cout << "g=gut, s=schlecht\n"; char eingabe; cin >> eingabe; if ( eingabe == 'g' ) { cout << "das ist aber schön\n"; } if ( eingabe == 's' ) // "else if" wäre aber sinnvoller :) { cout << "das ist aber schlecht\n"; } cin.clear(); cin.ignore(cin.rdbuf ()->in_avail()); cin.get(); return 0; // Bei einem vernünftigen Compiler überflüssig, aber ich schreibs trotzdem immer hin :) }
Habe auch noch einige andere Zeilen zusammengefasst
Viele Grüße,
Patrick
-
Danke für die vielen, schnellen Antworten,
dass "Programm" funktioniert nun einwandfrei.mfG, Nico
-
T0bi schrieb:
VERGISS NICHT DAS GETCHAR() ODER system( "PAUSE" ) AM ENDE DER MAIN !!!!!!
*Arghh*Ich glaub system("PAUSE") ist nicht so zu empfehlen!
Es ist zwar für Anfänger einfach zu merken und umzusetzen aber du verlierest damit deine Plattformunabhängigkeit, was ja eigentlich ein großer Vorteil von C++ ist!
Das heißt, das der Befehl system("PAUSE") funkt nur unter Windows!
...glaub ich jedenfalls...
-
Wenn du nur verhindern willst das sich das Fenster so schnell schließt und nicht mit dem System Befehl arbeiten willst, kannst du auch folgendes machen.
Du musst nur den <conio.h> einbinden und schon kannst du am ende deines Programmes einfach den Befehl getch(); verwenden.
Dieser wartet noch eine Tastatureingabe ab.#include <iostream> #include <conio.h> //<---- den brauchst du zusätzlich using namespace std; int main() { cout << "Wie ist denn Heute das Wetter?\n\n"; cout << "g=gut, s=schlecht\n"; char eingabe; cin >> eingabe; if ( eingabe == 'g' ) { cout << "das ist aber schön\n"; } if ( eingabe == 's' ) // "else if" wäre aber sinnvoller :) { cout << "das ist aber schlecht\n"; } getch(); return 0; // Bei einem vernünftigen Compiler überflüssig, aber ich schreibs trotzdem immer hin :) }
-
Last-Boyscout schrieb:
Wenn du nur verhindern willst das sich das Fenster so schnell schließt und nicht mit dem System Befehl arbeiten willst, kannst du auch folgendes machen.
Du musst nur den <conio.h> einbinden und schon kannst du am ende deines Programmes einfach den Befehl getch(); verwenden.
Dieser wartet noch eine Tastatureingabe ab.#include <iostream> #include <conio.h> //<---- den brauchst du zusätzlich using namespace std; int main() { cout << "Wie ist denn Heute das Wetter?\n\n"; cout << "g=gut, s=schlecht\n"; char eingabe; cin >> eingabe; if ( eingabe == 'g' ) { cout << "das ist aber schön\n"; } if ( eingabe == 's' ) // "else if" wäre aber sinnvoller :) { cout << "das ist aber schlecht\n"; } getch(); return 0; // Bei einem vernünftigen Compiler überflüssig, aber ich schreibs trotzdem immer hin :) }
lol aber wenn den tastaturpuffer nicht mit cin.clear(); cin.ignore(cin.rdbuf ()->in_avail()); löscht schließt sich das fenster trotzdem
-
Gaste schrieb:
Last-Boyscout schrieb:
Wenn du nur verhindern willst das sich das Fenster so schnell schließt und nicht mit dem System Befehl arbeiten willst, kannst du auch folgendes machen.
Du musst nur den <conio.h> einbinden und schon kannst du am ende deines Programmes einfach den Befehl getch(); verwenden.
Dieser wartet noch eine Tastatureingabe ab.#include <iostream> #include <conio.h> //<---- den brauchst du zusätzlich using namespace std; int main() { cout << "Wie ist denn Heute das Wetter?\n\n"; cout << "g=gut, s=schlecht\n"; char eingabe; cin >> eingabe; if ( eingabe == 'g' ) { cout << "das ist aber schön\n"; } if ( eingabe == 's' ) // "else if" wäre aber sinnvoller :) { cout << "das ist aber schlecht\n"; } getch(); return 0; // Bei einem vernünftigen Compiler überflüssig, aber ich schreibs trotzdem immer hin :) }
lol aber wenn den tastaturpuffer nicht mit cin.clear(); cin.ignore(cin.rdbuf ()->in_avail()); löscht schließt sich das fenster trotzdem
Nö...also bei mir nicht.
Bei mir wartet das Programm einen Tastaturbefehl ab.IDE == Dev C++
-
Naja, aber "conio.h" habe ich z.B. nicht...
Ruft Konsolenprogramme endlich auch über die Konsole auf! Die Bash kam schließlich auch vor X!
-
Last-Boyscout schrieb:
Nö...also bei mir nicht.
Bei mir wartet das Programm einen Tastaturbefehl ab.
IDE == Dev C++sry, so wies aussieht löscht getch (); den Tastaturpuffer automatisch
naja, wieder mal was dazugelernt
-
Gaste schrieb:
Last-Boyscout schrieb:
Nö...also bei mir nicht.
Bei mir wartet das Programm einen Tastaturbefehl ab.
IDE == Dev C++sry, so wies aussieht löscht getch (); den Tastaturpuffer automatisch
naja, wieder mal was dazugelerntKein Problem.
Das wusste ich auch nicht^^
Ich habs halt nur immer so gemacht.Was programieren angeht muss ich noch gewaltig was lernen.
-
cin.clear (); cin.ignore ( cin.rdbuf ()->in_avail () ); cin.get ();
Anstelle davon verwende ich immer:
cin.get (); cin.sync();
Erbringt den gleichen Effekt, sieht dazu noch schöner aus und
ist leichter zu merken.
-
Searence schrieb:
Anstelle davon verwende ich immer: [code] cin.get (); cin.sync();
Erbringt den gleichen Effekt, sieht dazu noch schöner aus und
ist leichter zu merken.Muss man nicht erst den Puffer löschen und dann auf die Eingabe warten? Also
cin.sync(); cin.get();
Und in meinem Buch ("C++ lernen und professionell anwenden") wird einmal folgendes benutzt:
cin.sync(); cin.clear(); cin.get();
Ist das auch eine Alternative, um zu verhindern, dass sich die Konsole zum Programmende gleich schließt? Schaut für mich als Anfänger einfacher aus.
Und was passiert da denn genau?cin.sync() löscht ja den Eingabepuffer, soweit klar, keine Zeichen mehr drin.
Und cin.clear() löscht laut Google die Fehlerflags. Aber was bedeutet das denn?
Denn den oben genannten Vorschlag aus der FAQ, also mit cin.ignore usw verstehe ich ehrlich gesagt noch weniger, was da passiert.
-
cin.clear () setzt den puffer wieder auf den ursprungsstatus zurück, dh fehler (die
du mit cin.fail () abfangen kannst) werden wieder gelöscht. fehler entstehen wenn
du in eine int-variable etwas einließt, aber ein buchstabe eingegeben wird.cin.ignore( cin.rdbuf ()->in_avail () ) bewirkt das gleiche wie cin.sync (), also
das löschen des eingabepufers.mfg Gaste
-
Soweit ich weiss ist es auch im Prinzip egal welche Reihenfolge, also ob:
cin.get(); cin.sync();
oder
cin.sync(); cin.get();
verwendet wird, solange du es auch immer nutzt. Denn im ersten Beispiel wird erst die Eingabe vorgenommen, und dann der Buffer schonmal für die nächste Eingabe geleert. (Der Buffer ist bei der ersten Eingabe, soweit ich weiss immer leer.)
Und dann geht es so weiter... Zweite Eingabe, dann Buffer leeren für dritte Eingabe, usw...
Bei der Version 2 wird halt direkt der Buffer für die nächste Eingabe geleert. Im Prinzip das gleiche, (zumindest im Endeffekt.)
-
Na denn, wenn
cin.sync(); cin.clear(); cin.get();
im Endeffekt dasselbe macht wie die in der FAQ vorgeschlagene Lösung, finde ich diese hier als Anfänger sehr viel verständlicher und einfacher zu merken.