cin und Escape



  • Wie schaffe ich es in folgenden Code:

    //[...]
    int laenge;
    //[...]
    if(option==1)
    {
       cout<<"Geben sie eine Laenge ein(Esc zum abbruch)\n\tEingabe: ";
       cin>>laenge;
    }
    //[...]
    

    aus dem if Block mit Esc Raus zu springen???



  • Das wird schwierig (und erfordert vermutlich systemspezifische Funktionen). Die elegantere Lösung dürfte es sein, eine andere Kennung als Abbruch zu verwenden (z.B. -1).



  • Ich dachte mir schon, dass es schwierig würde, aber dazu habe ich ja ein forum voller kompetenter Leute.^^

    Ich mag -1, aber nicht, denn es heisst ja nicht um sonst "escape"!



  • Du kannst auch E S C eingeben und anschließend per cin.fail() nachfragen, ob die letzte Eingabe als Zahl interpretiert werden konnte 😉

    (jenseits des ANSI-Standards würde mir noch einfallen, die Eingabe zeichenweise per getch() einzulesen und jedes Zeichen einzeln auszuwerten (ESC hat afaik den Wert 27, ENTER ist \n) - wie du dann die Eingabe in eine Zahl umwandeln kannst, verrät dir die FAQ (Einmal String nach Zahl und zurück))



  • Nett, das du es versuchst, aber auf einer Tastatur ist eine Teste Esc um die es mir ging und ich wollte keine andere Lösung.
    ==>mir geht es ums Prinzip

    //Ist auch wenn's vllt so rüber kommt echt nicht bös gemeint!!!
    //Wirklich!!!



  • dann bleibt noch immer die Lösung mit getch() (sieht etwas übel aus, aber zur Not kannst du es in eine Funktion auslagern):

    char ch;string input;
    do
    {
      ch=getch();
      if(ch==27) exit(0);//eventuell auch etwas sanfter ;)
      input.push_back(ch);
    }
    while(ch!='\n');
    laenge=atoi(input.c_str());
    

    Edit: Hauptnachteil dieses ansatzes ist, daß es nicht mehr portabel ist



  • CStoll schrieb:

    Hauptnachteil dieses ansatzes ist, daß es nicht mehr portabel ist

    Wegen dem atoi oder warum???

    Wenn man:

    char ch;string input;
    do
    {
      ch=getch();
      if(ch==27) break;
      input.push_back(ch);
    }
    while(ch!='\n');
    if(ch!=27)laenge=atoi(input.c_str());
    

    schreibt, brauch man das exit(0) nicht!



  • volkard schrieb:

    nö. wer in c++ exit(0) aufruft, beschwört dicke probleme herauf.

    Sucht nicht, es ist aus dem, allen regelmäßigen foren-Besuchern bekannten, thread: "Was genau bringen exceptions" in dem es ja eine Schlach zwischen ein paar idiotischen unreg's und ein paar reg's gegeben hat.



  • Jetzt hat ich grad die Frage vergessen:

    Warum hat volkard das geschrieben???



  • Weil exit(0) das Programm sozusagen durch die Wand beendet, und dabei keine Destruktoren mehr ausführt. Dann besser eine emergency_exit Exception werfen, die in main() gefangen wird und ein return auslöst.



  • Danke, wieder was gelernt!!



  • 3DG schrieb:

    CStoll schrieb:

    Hauptnachteil dieses ansatzes ist, daß es nicht mehr portabel ist

    Wegen dem atoi oder warum???

    Nein, wegen dem getch().



  • Inwiefern ist getch() nicht portabel???


Anmelden zum Antworten