Was ist der Unterschied zwischen getch() und getchar()?

Lesezeit: 6 Minuten

Benutzer-Avatar
Blase

Was ist der genaue Unterschied zw getch und getchar Funktionen?

getchar() ist eine Standardfunktion, die ein Zeichen aus der stdin erhält.

getch() ist nicht genormt. Es erhält ein Zeichen von der Tastatur (das sich möglicherweise von stdin unterscheidet) und gibt es nicht wieder.

  • Sir, könnten Sie mich bitte auf die Ressource(n) verweisen oder die Aussage “die sich möglicherweise von stdin unterscheidet” anhand eines Beispiels erläutern? Vielen Dank !

    – Rishi Shukla

    1. Dezember 2016 um 3:58 Uhr


  • Bedeutet, dass stdin kann die Tastatur oder ein anderer Eingabestrom sein.

    – Roy Dictus

    1. Dezember 2016 um 10:07 Uhr

Benutzer-Avatar
Steve Gipfel

Die Standard-C-Funktion ist is getchar()erklärt in <stdio.h>. Es existiert im Grunde seit Anbeginn der Zeit. Es liest ein Zeichen von der Standardeingabe (stdin), bei der es sich in der Regel um die Tastatur des Benutzers handelt, es sei denn, sie wurde umgeleitet (z. B. über das Shell-Eingabeumleitungszeichen <oder ein Rohr).

getch() und getche() sind alte MS-DOS-Funktionen, deklariert in <conio.h>, und immer noch beliebt auf Windows-Systemen. Sie sind keine Standard-C-Funktionen; Sie sind nicht auf allen Systemen vorhanden. getch liest einen Tastendruck sofort von der Tastatur, ohne darauf zu warten, dass der Benutzer die Return-Taste drückt, und ohne den Tastendruck zu wiederholen. getche ist das gleiche, außer dass es tut Echo. Soweit ich weiss, getch und getche stets von der Tastatur lesen; Sie sind von der Eingabeumleitung nicht betroffen.

Es stellt sich natürlich die Frage, ob getchar ist die Standardfunktion, wie verwenden Sie sie, um ein Zeichen zu lesen, ohne auf die Eingabetaste zu warten oder ohne Echo? Und die Antworten auf diese Fragen sind zumindest ein bisschen kompliziert. (Tatsächlich sind sie so kompliziert, dass ich vermute, dass sie die anhaltende Popularität von erklären getch und getchedie nicht zuletzt sehr einfach zu bedienen sind.)

Und die Antwort ist die getchar hat keine Kontrolle über Details wie Echos und Eingabepufferung – soweit C betroffen ist, sind dies systemabhängige Probleme auf niedrigerer Ebene.

Es ist jedoch nützlich, das grundlegende Eingabemodell zu verstehen, das getchar geht davon aus. Verwirrenderweise gibt es in der Regel zwei verschiedene Pufferstufen.

  1. Wenn der Benutzer Tasten auf der Tastatur eingibt, werden sie von den Tasten des Betriebssystems gelesen Terminaltreiber. Typischerweise gibt der Terminaltreiber in seinem Standardmodus Tastenanschläge unmittelbar nach der Eingabe wieder (damit der Benutzer sehen kann, was er eingibt). Typischerweise unterstützt der Terminaltreiber in seinem Standardmodus auch ein gewisses Maß an Zeilenbearbeitung – zum Beispiel kann der Benutzer die Entf- oder Rücktaste drücken, um ein versehentlich eingegebenes Zeichen zu löschen. Um die Zeilenbearbeitung zu unterstützen, sammelt der Terminaltreiber typischerweise Zeichen in einer Eingangspuffer. Nur wenn der Benutzer die Eingabetaste drückt, wird der Inhalt dieses Puffers dem aufrufenden Programm zur Verfügung gestellt. (Diese Pufferstufe ist nur vorhanden, wenn die Standardeingabe tatsächlich eine Tastatur oder ein anderes serielles Gerät ist. Wenn die Standardeingabe in eine Datei oder Pipe umgeleitet wurde, ist der Terminaltreiber nicht wirksam und diese Pufferstufe gilt nicht.)

  2. Das stdio-Paket liest Zeichen aus dem Betriebssystem in seinen eigenen Eingabepuffer. getchar holt einfach das nächste Zeichen aus diesem Puffer. Wenn der Puffer leer ist, versucht das stdio-Paket, ihn wieder aufzufüllen, indem es weitere Zeichen aus dem Betriebssystem liest.

Wenn wir also verfolgen, was passiert, wenn ein Programm aufruft getchar zum ersten Mal: ​​stdio entdeckt, dass sein Eingabepuffer leer ist, also versucht es, einige Zeichen aus dem Betriebssystem zu lesen, aber es sind noch keine Zeichen verfügbar, also die read Anrufblöcke. In der Zwischenzeit kann der Benutzer einige Zeichen eingeben, die sich im Eingabepuffer des Terminaltreibers ansammeln, aber der Benutzer hat die Eingabetaste noch nicht gedrückt. Schließlich drückt der Benutzer die Eingabetaste und die blockiert read call kehrt zurück und gibt die Zeichen einer ganzen Zeile an zurück stdioder sie verwendet, um seinen Eingabepuffer zu füllen, aus dem er dann den ersten an diesen ersten Aufruf zurückgibt getchar, die die ganze Zeit geduldig gewartet hat. (Und dann, wenn das Programm aufruft getchar ein zweites oder drittes Mal gibt es wahrscheinlich sind einige weitere Zeichen – die nächsten Zeichen in der Zeile, die der Benutzer eingegeben hat – verfügbar im Eingabepuffer von stdio für getchar sofort zurückzugeben. Etwas mehr dazu siehe Abschnitt 6.2 von diesen Notizen zum C-Kurs.)

Aber bei all dem, wie Sie sehen können, getchar und das stdio-Paket haben keine Kontrolle über Details wie Echos oder die Bearbeitung von Eingabezeilen, da diese früher auf einer niedrigeren Ebene im Terminaltreiber in Schritt 1 behandelt werden.

Wenn Sie also zumindest unter Unix-ähnlichen Betriebssystemen ein Zeichen lesen möchten, ohne auf die Eingabetaste zu warten, oder steuern möchten, ob Zeichen wiedergegeben werden oder nicht, tun Sie dies, indem Sie das Verhalten des Terminaltreibers anpassen. Die Details variieren, aber es gibt eine Möglichkeit, das Echo ein- und auszuschalten, und eine Möglichkeit (eigentlich mehrere Möglichkeiten), die Eingabezeilenbearbeitung ein- und auszuschalten. (Zumindest einige dieser Details finden Sie in dieser SO-Frage oder Frage 19.1 im alten C FAQ-Liste.)

Wenn die Eingabezeilenbearbeitung ausgeschaltet ist, kann das Betriebssystem Zeichen sofort zurückgeben (ohne auf die Eingabetaste zu warten), da es sich in diesem Fall keine Sorgen machen muss, dass der Benutzer möglicherweise einen falschen Tastendruck eingegeben hat, der “genommen” werden muss zurück” mit der Entf- oder Backspace-Taste. (Aber aus dem gleichen Grund muss ein Programm, wenn es die Eingabezeilenbearbeitung im Terminaltreiber ausschaltet, wenn es den Benutzer Fehler korrigieren lassen möchte, seine eigene Bearbeitung implementieren, weil es sehen wird — das heißt, sukzessive Anrufe zu getchar zurückgeben werden – sowohl die falschen Zeichen des Benutzers und der Zeichencode für die Entf- oder Rücktaste.)

  • Gibt es Hinweise, wie das Verhalten des Terminaltreibers angepasst werden kann?

    – Das ist nicht mein richtiger Name

    4. Juli 2018 um 18:15 Uhr

  • @Thisisn’tmyrealname Alle blutigen Details: Nein. Hinweise: Guter Vorschlag; hinzugefügt.

    – Steve Summit

    5. Juli 2018 um 10:47 Uhr


Benutzer-Avatar
komisch

getch() Es erhält nur eine Eingabe, zeigt diese jedoch nie als Ausgabe auf dem Bildschirm an, obwohl wir eine Eingabetaste gedrückt haben.

getchar() Es erhält eine Eingabe und zeigt sie auf dem Bildschirm an, wenn wir die Eingabetaste drücken.

  • getchar() gibt das Zeichen zurück, zeigt es aber nicht an. das ist Sache des Programmierers. getchar() kann von stdin lesen, bevor die Eingabetaste gedrückt wird, wenn die Eingabe nicht gekocht ist.

    – Ryan Haining

    15. August 2014 um 20:42 Uhr

Benutzer-Avatar
Lundin

  • getchar ist Standard C, gefunden in stdio.h. Es liest ein Zeichen aus stdin(der Standard-Eingabestrom = Konsoleneingabe auf den meisten Systemen). Es ist ein blockierender Aufruf, da der Benutzer ein Zeichen eingeben und dann die Eingabetaste drücken muss. Es gibt Benutzereingaben auf dem Bildschirm wieder.

  • getc(stdin) entspricht zu 100% getcharaußer dass es auch für andere Eingabeströme verwendet werden kann.

  • getch ist nicht standardisiert und findet sich typischerweise im alten veralteten MS-DOS-Header conio.h. Es funktioniert genauso wie getchar Abgesehen davon, dass es nach dem ersten Tastendruck nicht blockiert, ermöglicht es dem Programm, fortzufahren, ohne dass der Benutzer die Eingabetaste drückt. Eingaben auf dem Bildschirm werden nicht wiedergegeben.

  • getche ist das gleiche wie getchebenfalls nicht standardmäßig, aber es gibt Eingaben auf dem Bildschirm wieder.

1304920cookie-checkWas ist der Unterschied zwischen getch() und getchar()?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy