Warum getch() zurückkehrt, bevor eine beliebige Taste drücken?
int main(int argc, char *argv[], char *env[])
{
printf("Press any key to exit.\n");
getch();
return 0;
}
Laut der man-page,
getch
sollte warten, bis irgendeine Taste gedrückt wird
...aber in der Tat gibt es direkt vor drücken Sie eine beliebige Taste. (Der Wert, der zurückgegeben wird -1
).
Warum?
Update
Bin ich auf Linux. Wie kann ich das umsetzen Press any key to exit.
wenn Sie nicht getch()
?
getchar()
wird erst wieder nach drücken Sie die EINGABETASTE, es ist nicht das, was ich will.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Unter Linux
getch()
ist wahrscheinlich diecurses
Funktion, die so ganz anders ist das Windows-spezifische Funktion mit dem gleichen Namen.curses
(ncurses
) ist wahrscheinlich overkill für das, was Sie tun möchten.Der einfachste Ansatz wäre, zu warten, bis der Benutzer die Taste Enter, die Sie tun können, wie diese:
Wenn Sie wirklich wollen, dass die Benutzer in der Lage sein zu drücken alle Schlüssel, nicht nur Enter, die Sie tun können, so etwas wie dieses:
Zweiten
stty
wieder geben soll die ein tty-Gerät, um vernünftige Einstellungen (sollte es wirklich wieder, was Sie waren, aber das speichern und wiederherstellen der Zustand ist ein wenig komplizierter). Es gibt wahrscheinlich sauberere Möglichkeiten, das zu tun (mit was auch immer-Bibliothek Funktionen, diestty
Programm selbst verwendet).EDIT: Lesen eines einzelnen Zeichens, ohne zu warten, für Enter ist eine Häufig gestellte Frage. In der Tat, es ist die Frage 19.1 in der comp.lang.c FAQ.
EDIT2: ich noch nicht viel getan, Arbeit mit Flüche vor kurzem, aber ich habe gerade einige spielen mit ihm. Es scheint, dass
getch()
wird nicht funktionieren, es sei denn, rufen Sie zunächstinitscr()
-- undinitscr()
löscht den Bildschirm. curses ist vorgesehen für die Verwendung mit Anwendungen wie text-Editoren, die müssen volle Kontrolle über das display. Es kann ein Weg, umgetch()
ohne die Bedienung des Bildschirms, aber ich habe es nicht gefunden.Den
system("stty ...")
Durcheinander könnte in der Tat der beste Ansatz sein.EDIT3: Die
termios
Lösung in die andere Antwort ist wahrscheinlich die beste (system("stty ...")
ist einfacher, aber auch das aufrufen eines externen Programms fühlt sich an wie overkill.Als für die OP ' s Kommentar "ich kann nicht glauben, dass
Press any key to exit.
ist so lästig, zu tun in c", ja, das scheint merkwürdig-aber weiter dachte, gibt es triftige Gründe für Sie.Werfen Sie einen Blick auf die installierten Programme auf einem typischen Unix-oder Linux-system. Ich denke, Sie werden feststellen, dass sehr wenige von Ihnen benötigen diese Art der Eingabe (warten auf einen einzigen Tastendruck).
Viele Programme arbeiten mit den Kommandozeilen-Argumenten und Daten Lesen aus Dateien oder aus
stdin
. Alles, was der Benutzer eingibt wird die Eingabe von Daten, keine Befehle oder Antworten auf Eingabeaufforderungen.Einige Programme Fragen, für die Bestätigung bei einigen Aktionen (Installateure wie
apt-get
undcpan
tun dies oft) - aber Sie in der Regel Lesen Linie der Eingabe und prüfen der ersten Zeichen. Oder, für einige drastische Maßnahmen, die Sie möglicherweise benötigen, geben Sie das ganze Wort "ja" gefolgt von Enter (wollen Sie nicht formatieren Sie Ihre Festplatte, weil Sie versehentlich eine Taste drücken).Natürlich viele Programme (text-Editoren, Datei-Viewer) Lesen einzelne Zeichen nicht als echo-Eingang, aber solche Programme neigen dazu, auf Basis von curses; Sie übernehmen die Kontrolle über die gesamte terminal-Fenster.
Schließlich eine Reihe von Programmen GUI-Schnittstellen (web-Browser, etc.); Sie wahrscheinlich nicht einmal Lesen von stdin.
Meisten Produktions-Unix-Programme, die nicht verwenden oder müssen
Press any key to exit
fordert. Machen Sie einfach Ihre Arbeit, oft still, und dann kündigen, so können Sie die nächste Sache. Der Bedarf besteht hauptsächlich für relativ Elementare Programme, wie z.B. Hausaufgaben. Nicht, dass es etwas falsch mit Hausaufgaben, aber das system als ganzes ist nicht in Erster Linie entwickelt, um die Unterstützung einer solchen Verwendung./lib64/libncurses.so.5.6
, wissen Sie, wie kann ich wissen, die version dieses ncurses-Bibliothek?ncurses-1.8.5
?getch();
funktioniert nicht wie erwartet, Weg..getch()
. Und siehe meinen neusten edit an meine Antwort.-1
. Vertrauen Sie mir, es sollte bug in meiner version von ncurses.Press any key to exit.
ist so lästig, zu tun, in c..Hier ein minimal-Beispiel
Aber es scheint nicht zu irgendeiner Weise zu verwenden, ncurses, ohne den Bildschirm zu löschen. Mit dem Makel der Overkill, vielleicht?!
Bearbeiten
Hier ist eine andere Weise, ich habe zu arbeiten. Nicht Flüche, noch macht Sie den Bildschirm deaktivieren.
In der manpage sagt cfmakeraw() möglicherweise nicht vollständig tragbar. Aber es ist nur eine Abkürzung für die Einstellung eine Unmenge von Fahnen:
initscr
wil löscht den Bildschirm,wodurch seltsame Erfahrung..