2008-11-06 25 views
10

Estoy usando getch() y mi aplicación falla instantáneamente. Incluyendo cuando se hace:Equivalente a Windows getch() para bloqueos Mac/Linux

int main() 
{ 
    getch(); 
} 

No puedo encontrar el enlace pero se supone que el problema es que se necesita para convertir el uso del búfer o algo extraño en ese sentido, y todavía quiero cout para trabajar junto con el código de plataforma cruzada.

Me dijeron que use std::cin.get(), pero me gustaría que la aplicación se cierre cuando se presiona una tecla, no cuando el usuario ingresó una letra o número y luego presione intro para salir.

¿Hay alguna función para esto? El código debe funcionar bajo Mac (my os) y Windows.


Enlazar/compilar no es un issue; Incluyo <curses.h> y lo conecto con -lcurses en XCode, mientras que Windows usa <conio.h>.

+0

Tenga en cuenta que 'cout' es una construcción C++. Aunque las respuestas hasta ahora son principalmente para C, también se aplicarán a C++. Y std :: cin.get() estaría atascado esperando una línea de entrada de terminal - el síndrome de 'Hit Enter' - tanto como getchar() o cualquier otra función de E/S estándar. –

Respuesta

11

¿Ha buscado en <curses.h> para ver qué función tiene getch()?

Nota: OSX y Linux no son lo mismo que Windows.

Específicamente, como una macro en <curses.h>, encontramos:

#define getch() wgetch(stdscr) 

Ahora, parece, en su sistema, al ser una función real getch() en la biblioteca maldiciones, pero se espera que stdscr que se creará , y eso se hace mediante las funciones de inicialización de curses (initscr() y parientes), y su código no lo hace. Por lo tanto, su código está invocando un comportamiento indefinido llamando a las rutinas de curses antes de que se realice la inicialización correcta, lo que lleva a la falla.

(buena pista de dmckee - que ayudó a que la línea de enlace de acidzombie24, que era importante.)

Para llegar a un punto en el que una sola llave de carrera se puede leer y el programa termina limpiamente, se tiene que hacer un buen trabajo en Unix (OSX, Linux). Debería atrapar el estado inicial del terminal, disponer una función atexit(), o algún mecanismo similar, para restaurar el estado del terminal, cambiar el terminal del modo cocinado al modo raw, luego invocar una función para leer un carácter (posiblemente solo read(0, &c, 1)), y haz tu salida. Puede haber otras formas de hacerlo, pero ciertamente implicará algunas operaciones de configuración y desmontaje.

Un libro que podría ayudar es Advanced Unix Programming, 2nd Edn por Mark Rochkind; cubre el manejo del terminal al nivel necesario. Alternativamente, puede usar el <curses.h> de forma adecuada, que será más simple que una solución de rollo propio y probablemente más confiable.

2

No ha exhibido una línea

#include <stdio.h> 

o

#include <curses.h> 

o similar. ¿Estás seguro de que estás enlazando con una biblioteca que incluyegetch()?

+0

enlazar/compilar no es un problema, incluyo curses y do -lcurses en xcode. window usa conio.h –

-1

La función getch no está disponible en sistemas tipo Unix, pero puede reemplazarla con comandos de consola a través de su compilador con la función system.

Uso:

En Windows puede utilizar system("pause");

En sistemas tipo Unix (como OSX) se puede utilizar system("read -n1 -p ' ' key");

Nota: system se declara en <stdlib.h>.

+0

esto pausará su programa hasta que el usuario presione una tecla -cualquier clave- igual que en 'getch();' – David

+3

Por favor absténgase de sugerir llamadas 'system()'. Es una mala práctica de programación y tiene malos efectos secundarios. – user2064000

0

Utilice la función cin.get() por ejemplo:

#include <iostream> 

using namespace std; 

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

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

El programa luego esperar a que se pulse una tecla.

Una vez que tenga, la tecla que presionó se imprimirá en la pantalla.

+0

O simplemente usa la función getchar() – Benjamin