Programm blinkt nur kurz auf



  • Moin allerseits,
    da ich noch ein totaler Anfänger bin, wollte ich mal fragen, warum das Programm trotz der cin.get() Funktion in der If-Schleife nicht auf einen tastendruck wartet, sondern sich sosort beendet.

    #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.get();
                                          }
        if (eingabe=='s')
        {
                       cout<<"das ist aber schlecht\n"<<cin.get();
                                          }
    }
    

    mfg, Nico



  • 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 😉



  • VERGISS NICHT DAS GETCHAR() ODER system( "PAUSE" ) AM ENDE DER MAIN !!!!!!
    *Arghh*



  • 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 dazugelernt

    Kein 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.


Anmelden zum Antworten