Ich versuche, ein C ++ - Programm zu schreiben, in dem der Benutzer, wenn er ein Zeichen über die Tastatur eingibt, in die nächste Codezeile wechseln soll.
Hier ist mein Code:
char c;
cin>>c;
cout<<"Something"<<endl;
Dies funktioniert jedoch nicht, da es nur in die nächste Zeile wechselt, wenn ich ein Zeichen eingebe und dann die EINGABETASTE drücke.
ODER
Wenn ich das benutze
cin.get() or cin.get(c)
Wenn ich die Eingabetaste drücke, wechselt es zur nächsten Anweisungszeile.
Aber ich wollte, dass es mit einer beliebigen Taste auf der Tastatur in die nächste Zeile wechselt. Wie kann das gemacht werden?
Antworten:
Unter Windows:
und auf Mac und Linux:
gibt "Drücken Sie eine beliebige Taste, um fortzufahren ..." aus und warten Sie, bis eine beliebige Taste gedrückt wird. Ich hoffe das hast du gemeint
quelle
system
ruft externes Programm auf. Sie müssen kein externes Programm aufrufen, um auf einen Schlüssel zu warten! Es ist, als würde man eine andere Person anrufen, um den Computer einzuschalten, wenn Sie davor sitzen - dies ist eine langsame Lösung.Wenn Sie unter Windows arbeiten, können Sie das verwenden,
kbhit()
das Teil der Microsoft-Laufzeitbibliothek ist. Wenn Sie unter Linux arbeiten, können Sie Folgendes implementierenkbhit
( Quelle ):Update: Die obige Funktion funktioniert unter OS X (zumindest unter OS X 10.5.8 - Leopard, daher würde ich erwarten, dass sie unter neueren Versionen von OS X funktioniert). Dieser Kern kann unter
kbhit.c
Linux und OS X mit gespeichert und kompiliert werdenWenn mit ausgeführt
Es fordert Sie zur Eingabe eines Tastendrucks auf und wird beendet, wenn Sie eine Taste drücken (nicht beschränkt auf Eingabetaste oder druckbare Tasten).
@Johnsyweb - bitte erläutern Sie, was Sie unter "detaillierter kanonischer Antwort" und "allen Bedenken" verstehen. Auch "plattformübergreifend": Mit dieser Implementierung
kbhit()
können Sie die gleiche Funktionalität in einem C ++ - Programm unter Linux / Unix / OS X / Windows haben - auf welche anderen Plattformen beziehen Sie sich möglicherweise?Weiteres Update für @Johnsyweb: C ++ - Anwendungen leben nicht in einer hermetisch abgeschlossenen C ++ - Umgebung. Ein wichtiger Grund für den Erfolg von C ++ ist die Interoperabilität mit C. Alle Mainstream-Plattformen sind mit C-Schnittstellen implementiert (auch wenn die interne Implementierung C ++ verwendet), sodass Ihre Rede von "Legacy" fehl am Platz zu sein scheint. Und da wir über eine einzelne Funktion sprechen, warum benötigen Sie dafür C ++ ("C mit Klassen")? Wie bereits erwähnt, können Sie problemlos in C ++ schreiben und auf diese Funktionalität zugreifen, und es ist unwahrscheinlich, dass sich die Benutzer Ihrer Anwendung darum kümmern, wie Sie sie implementiert haben.
quelle
kbhit()
Funktion deklariert eineterminal_settings
Variable in einer Zeile, die scheinbar nichts tut, und dennoch alles tut. Einige mögen denken, dass es ordentlich ist, aber ich finde es bis zur Unlesbarkeit dunkel.Es gibt keine vollständig tragbare Lösung.
Frage 19.1 der häufig gestellten Fragen zu comp.lang.c behandelt dies ausführlich mit Lösungen für Windows, Unix-ähnliche Systeme und sogar MS-DOS und VMS.
Eine schnelle und unvollständige Zusammenfassung:
curses
Bibliothek verwenden; Aufrufcbreak()
gefolgt vongetch()
(nicht zu verwechseln mit der Windows-spezifischengetch()
Funktion). Beachten Sie, dass imcurses
Allgemeinen die Kontrolle über das Terminal übernommen wird, sodass dies wahrscheinlich zu viel des Guten ist.ioctl()
die Terminaleinstellungen ändern.tcgetattr()
undtcsetattr()
möglicherweise eine bessere Lösung.system()
denstty
Befehl aufrufen .getch()
oder verwendengetche()
.SMG$
Routinen von Screen Management ( ) den Trick ausführen.Alle diese C-Lösungen sollten in C ++ gleich gut funktionieren. Ich kenne keine C ++ - spezifische Lösung.
quelle
Um diese Funktionalität zu erreichen, können Sie die ncurses- Bibliothek verwenden, die sowohl unter Windows als auch unter Linux (und meines Wissens unter MacOS) implementiert wurde.
quelle
In Windows erreicht dieses kurze Programm das Ziel:
getch
Die Konsole wird angehalten, bis eine Taste gedrückt wird ( https://www.geeksforgeeks.org/difference-getchar-getch-getc-getche/ ).Es ist zu beachten, dass getch nicht Teil der Standardbibliothek ist.
quelle
getch()
sich voncin.get
odercin>>
, vielleicht ein Link zur Dokumentation unterscheidetIch habe untersucht, was Sie erreichen wollen, weil ich mich erinnere, dass ich das Gleiche tun wollte. Inspiriert von Vinay habe ich etwas geschrieben, das für mich funktioniert und ich verstehe es irgendwie. Aber ich bin kein Experte, also seien Sie bitte vorsichtig.
Ich weiß nicht, woher Vinay weiß, dass Sie Mac OS X verwenden. Aber es sollte mit den meisten Unix-ähnlichen Betriebssystemen so funktionieren. Wirklich hilfreich als Ressource ist opengroup.org
Stellen Sie sicher, dass Sie den Puffer leeren, bevor Sie die Funktion verwenden.
O_NONBLOCK scheint auch eine wichtige Flagge zu sein, aber es hat nichts für mich geändert.
Ich schätze es, wenn Leute mit etwas tieferem Wissen dies kommentieren und Ratschläge geben würden.
quelle
Sie können die Microsoft-spezifische Funktion _getch verwenden :
quelle
Dies funktioniert auf einer Windows-Plattform: Sie verwendet die Mikroprozessorregister direkt und kann zum Überprüfen des Tastendrucks oder der Maustaste verwendet werden
quelle
Wenn Sie Visual Studio 2012 oder älter verwenden, verwenden Sie die
getch()
Funktion. Wenn Sie Visual Studio 2013 oder höher verwenden, verwenden Sie_getch()
. Sie müssen verwenden#include <conio.h>
. Beispiel:quelle
Sie können die getchar- Routine verwenden.
Über den obigen Link:
quelle
Sie können auch getch () von conio.h verwenden. Genau wie dieser:
Da UNIX nicht über conio.h verfügt, können wir getch () mit diesem Code simulieren (aber dieser Code wurde bereits von Vinary geschrieben, mein Fehler):
quelle
Wenn Sie jetzt die Funktion kbhit () in MSDN nachschlagen, heißt es, dass die Funktion veraltet ist. Verwenden Sie stattdessen _kbhit ().
quelle
quelle
Verwenden Sie einfach den
system("pause");
Befehl.Alle anderen Antworten erschweren das Problem.
quelle