Änderung/Erweiterung des FAQ-Eintrags "Automatisches Schließen verhindern"



  • Hi,

    ich poste einfach mal die Stelle vom anderen Thread:
    http://www.c-plusplus.net/forum/viewtopic-var-p-is-1300385.html#1300385

    Only a wish 🙂 Vllt lässt sichs ja darüber diskutieren ...



  • Hi,

    nur mal so eine Frage am Rande:

    #include <iostream>
    #include <limits>
    
    using namespace std;
    
    int main ()
    {
    	cin.clear();
    	cin.ignore ( std::numeric_limits<std::streamsize>::max(), '\n');
    	cin.get(); 
    	return 0;
    }
    

    Das Programm sollte doch eigentlich warten, bis einmal enter gedrückt wurde und dann schließen. Bei mir wird es nämlich erst geschlossen, wenn ich das zweite Mal enetr gedrückt habe.

    Habe ich da was falsch verstanden?

    Compiler VC++ EE



  • Blacker schrieb:

    Das Programm sollte doch eigentlich warten, bis einmal enter gedrückt wurde und dann schließen. Bei mir wird es nämlich erst geschlossen, wenn ich das zweite Mal enetr gedrückt habe.

    Hi, das ist schon richtig so, denn ignore() ignoriert ja soviele Zeichen wie streamsize.limit ( das sind viele-dauert lange ) zurückliefert oder wenn es auf ein \n trifft.
    Nach einem Enter trifft er auf das \n und dann kommt ja nochmal cin.get() was wieder auf ein Enter wartet.

    Jetzt könnt man sich denken man lässt das cin.get() weg.
    Was passiert aber wenn dein "Super-PC" es ganz schnell schafft die ganzen Zeichen zu ignorieren, dann schwuups Fenster wieder zu.
    Deswegen das get() nochmals zur Sicherheit ...



  • cin.clear();
    cin.ignore ( cin.rdbuf()->in_avail() + 1 );
    cin.get();
    

    So, das ist nun meiner Meinung die beste Version 😉 Wenn in_avail() eine 0 zurückliefert und 0 Zeichen ignoriert werden, streikt get().

    Die +1 rettet uns dann aus einem 0-Fall.

    Finde es alles irgendwie bissl mystisch, vllt bringt mal irgendwann jemand Licht in die Dunkelheit ...



  • benutzt einfach std::getline und ihr braucht so einen schwachsinn nicht



  • KasF schrieb:

    Blacker schrieb:

    Das Programm sollte doch eigentlich warten, bis einmal enter gedrückt wurde und dann schließen. Bei mir wird es nämlich erst geschlossen, wenn ich das zweite Mal enetr gedrückt habe.

    Hi, das ist schon richtig so, denn ignore() ignoriert ja soviele Zeichen wie streamsize.limit ( das sind viele-dauert lange ) zurückliefert oder wenn es auf ein \n trifft.
    Nach einem Enter trifft er auf das \n und dann kommt ja nochmal cin.get() was wieder auf ein Enter wartet.

    Jetzt könnt man sich denken man lässt das cin.get() weg.
    Was passiert aber wenn dein "Super-PC" es ganz schnell schafft die ganzen Zeichen zu ignorieren, dann schwuups Fenster wieder zu.
    Deswegen das get() nochmals zur Sicherheit ...

    Ich glaube was du schreibst ist Schwachsinn.
    Wenn keine Zeichen da sind und man macht ignore mit eine Anzahl größer 0 dann wird auf eine Eingabe gewartet.

    #include <iostream>
    
    int main ()
    {
    	std::cin.ignore(1);
    }
    


  • Ja hast Recht.

    fonostar schrieb:

    Wenn keine Zeichen da sind und man macht ignore mit eine Anzahl größer 0 dann wird auf eine Eingabe gewartet.

    Ist mir auch gestern klar geworden. Keine Ahung wieso ich so ein Mist geschrieben habe 🙂 Vllt ist es die Erkältung oder der Fieber 🙂

    Seltsam find ich es aber trotzdem das bei einem ignore(0) cin.get() nicht funktionieren will.



  • Scheint alles seine Vor- und Nachteile zu haben und scheinbar funktioniert nichts überall?!

    Also solange hier keine auf mehreren Compilern funktionierende und geteste Version auftaucht behalte ich die derzeitige Version - die funktioniert am Häufigsten *g*

    MfG SideWinder



  • SideWinder schrieb:

    Also solange hier keine auf mehreren Compilern funktionierende und geteste Version auftaucht behalte ich die derzeitige Version

    Die hier:

    cin.clear();
    cin.ignore ( cin.rdbuf()->in_avail() + 1,'\n' );
    cin.get();
    

    funktioniert bei mir beim Visual,mingw und gcc. Kannst es ja auch mal noch bei paar anderen Compilern versuchen ...



  • KasF schrieb:

    SideWinder schrieb:

    Also solange hier keine auf mehreren Compilern funktionierende und geteste Version auftaucht behalte ich die derzeitige Version

    Die hier:

    cin.clear();
    cin.ignore ( cin.rdbuf()->in_avail() + 1,'\n' );
    cin.get();
    

    funktioniert bei mir beim Visual,mingw und gcc. Kannst es ja auch mal noch bei paar anderen Compilern versuchen ...

    ... wird das ignoriert ? Beim neunen Turbo funktionierts ebenfalls ...



  • FAQ-Einträge werden nach der Matura von mir geupdated, bzw. vielleicht ist mein Kumpane AJ wieder mal zugegen. Nur keine Sorge, erinnere mich nach meiner Maturareise am 30.06 nochmal 🤡

    MfG SideWinder



  • Okidokey ...



  • Psst SideWinder, du dürftest doch garnicht hier sein :p


Anmelden zum Antworten