Frage

Ich bin mit getch() und meine app stürzt sofort. Einschließlich, wenn dabei:

int main()
{
    getch();
}

Ich kann den Link finden, aber angeblich das Problem ist, dass es Pufferung oder etwas Fremdes in diese Richtung deaktivieren muss, und ich will noch cout mit Cross-Plattform-Code arbeiten zusammen.

Mir wurde gesagt, std::cin.get() zu verwenden, aber ich würde die App gefällt zu beenden, wenn eine Taste gedrückt wird, nicht, wenn der Benutzer in einem Buchstaben oder eine Zahl eingegeben drücken Sie die Eingabetaste zu beenden.

Gibt es eine Funktion für das? Der Code muss unter Mac arbeiten (meine os) und Windows.


Die Verknüpfung / Compilieren ist kein Ausgabe ; Ich schließe <curses.h> und Link mit -lcurses in XCode, während Windows <conio.h> verwendet.

War es hilfreich?

Lösung

Haben Sie in <curses.h> schaute, um zu sehen, was die getch() Funktion hat?

Hinweis: OSX und Linux sind nicht das gleiche wie Windows-

.

Im Einzelnen als Makro in <curses.h>, finden wir:

#define getch() wgetch(stdscr)

Nun scheint es, die auf dem System, eine tatsächliche Funktion getch() in der Flüche Bibliothek zu sein, aber es erwartet stdscr eingerichtet werden soll, und das wird durch die Flüche Initialisierungsfunktionen (initscr() und Verwandte) getan, und das ist signally nicht von Ihrem Code. Also, Ihr Code nicht definiertes Verhalten Aufruf von Flüche-Routinen aufrufen, bevor die korrekte Initialisierung erfolgt ist, zum Absturz führt.

(Good Hinweis von Dmckee - es half die Verbindungslinie aus acidzombie24 zu bekommen, was wichtig war.)

Um zu einem Punkt, wo ein einzelner Schlüssel Takt gelesen werden kann und das Programm sauber beendet, haben Sie auf Unix (OSX, Linux) eine Menge Arbeit zu tun. Sie würden den Anfangszustand des Terminals zu stoppen haben, sorgen für eine atexit() Funktion - oder einen ähnlichen Mechanismus - den Zustand des Terminals wieder herzustellen, das Terminal aus gekochtem Modus in Raw-Modus zu ändern, ruft dann eine Funktion ein Zeichen zu lesen ( möglicherweise nur read(0, &c, 1)), und tun Sie Ihre Ausfahrt. Es könnten auch andere Möglichkeiten, es zu tun -. Aber es wird sicherlich einige Auf- und Abbau-Operationen beinhalten

Ein Buch, das helfen könnte, ist Erweiterte Unix Programmierung, 2. Ausgabe von Mark Rochkind; es umfasst Terminalsteuerung auf der Ebene benötigt wird. Alternativ können Sie <curses.h> richtig nutzen -., Die einfacher ist als eine Roll-your-own-Lösung sein, und wahrscheinlich zuverlässige

Andere Tipps

Sie haben nicht ausgestellt a

#include <stdio.h>

oder

#include <curses.h>

oder ähnliche Linie. Sind Sie sicher, dass Sie gegen eine Bibliothek verknüpfen, dass enthält getch()?

die cin.get () Funktion verwenden, zB:

#include <iostream>

using namespace std;

int main()
{
  char input = cin.get();

  cout << "You Pressed: " << input;
}

Das Programm würde dann warten Sie eine Taste drücken.

Sobald Sie die Taste, die Sie auf dem Bildschirm ausgegeben werden würde gedrückt werden.

Die getch Funktion ist auf Unix-ähnlichen Systemen nicht zur Verfügung, aber Sie können es mit Konsolenbefehle durch den Compiler mit der system Funktion ersetzen.

Verbrauch:

Unter Windows können Sie system("pause"); verwenden

In Unix-ähnlichen Systemen (wie OSX) Sie können system("read -n1 -p ' ' key"); verwenden

. Hinweis: system wird in <stdlib.h> erklärt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top