getch(), getche(), kbhit(), getchar()



  • Neben der Standardeingabe in C/C++ (scanf() bzw. cin) sind auch noch weitere (meist nicht direkt zum Standard gehörende) Funktionen im Umlauf die einzelne Zeichen einlesen.

    getchar() <cstdio> (in C: <stdio.h>) : Diese Funktion gehört zum C/C++-Standard. Sie liest ein Zeichen der Standardeingabe und liefert dieses als Integer zurück, wobei der zurückgegebene Wert das Zeichen im jeweiligen Zeichensatz (z.B. ANSI-Zeichensatz) enthält. Ich persönlich würde sie aber maximal bei standardkonformen Programmen einsetzen, da sie zwar nur ein Zeichen zurückgibt, der Benutzer aber sowohl in der Lage ist mehrere Zeichen einzugeben (diese kommen dann bei weiteren Aufrufen von getchar() zurück - ohne das der Benutzer dann die Chance hat andere Zeichen einzugeben).

    getch() <conio.h> : Diese Funktion ist defakto Standard und funktioniert ähnlich wie getchar(). Mit dem Unterschied, dass der Benutzer auch wirklich nur maximal ein Zeichen eingeben kann. Außerdem erzeugt getch() kein Echo auf der Konsole, d.H. der Benutzer sieht nicht was er eingibt (geeignet z.B. für kleine Spiele oder die Eingabe eines Passwortes).

    getche() <conio.h> : Diese Funktion ist gleich getch() und erzeugt ein Echo auf der Konsole.

    kbhit() <conio.h> (beim DJGPP <pc.h>) : Diese Funktion dient nicht direkt zum Einlesen von Zeichen, sondenr prüft ob der Benutzer eine Taste gedrückt hat. Ist das der Fall liefert die Funktion 1 (true), ansonsten 0 (false). Das Zeichen selbst wird dabei noch nicht gelesen, kann dann aber durch einen direkt darauffolgenden Aufruf von getch() eingelesen werden. Für kleine Spiele in der Konsole ergibt sich folgender Aufbau:

    bool exit = false;
    while(!exit)
    {
        if(kbhit()) // Nur wenn auch eine Taste gedrückt ist
        {
            char c = getch(); // Muss auf keine Eingabe warten, Taste ist bereits gedrückt
            switch(c)
            {
                ... // Verarbeite Eingabe
            }
        }
    
        // Bewege andere Spielfiguren (z.B. die Snake-Schlange)
    
        // Geschwindigkeitsregler
        Sleep(10);
    }
    

    !! Hinweise / Probleme !!

    • Man sollte niemals das Automatische Schließen der Konsole, durch ein einfaches getch() / getche() / getchar() am Ende lösen. Dies funktioniert zwar in vielen Fällen - aber eben nur in vielen und nicht in allen. Eine Lösung die immer funktionieren sollte, findet man ebenfalls in der Konsolen-FAQ unter "Automatisches Schließen verhindern".
    • Zweitens gibt es Tasten bzw. auch Tastenkombinationen, denen kein Ascii-/Ansi-Code zugewiesen wurde (berühmtestes Beispiel hierfür sind wohl die Pfeiltaste ). Die oben genannten Funktionen geben in solchen Fällen Sondercodes zurück. Mehr zu diesem Thema finden sie unter "Einlesen von Pfeiltasten und Tastenkombinationen"

    MfG SideWinder

    PS: Wenn ihr Fehler findet, meldet euch bitte umgehend.


Anmelden zum Antworten