Pregunta

estoy usando getch() y mi aplicación falla al instante.Incluyendo al hacer:

int main()
{
    getch();
}

No puedo encontrar el enlace, pero supuestamente el problema es que es necesario desactivar el almacenamiento en búfer o algo extraño por el estilo, y todavía quiero cout para trabajar junto con código multiplataforma.

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

¿Hay alguna función para esto?El código debe funcionar en Mac (mi sistema operativo) y Windows.


Vincular/compilar no es una asunto;Incluyo <curses.h> y vincular con -lcurses en XCode, mientras que Windows usa <conio.h>.

¿Fue útil?

Solución

¿Has mirado en <curses.h> para ver qué hace la función getch()?

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

Específicamente, como macro en stdscr, encontramos:

#define getch() wgetch(stdscr)

Ahora, parece que, en su sistema, hay una función real initscr() en la biblioteca de curses, pero espera que se configure atexit(), y eso se hace mediante las funciones de inicialización de curses (read(0, &c, 1) y parientes), y eso no lo hace su código. Entonces, su código invoca un comportamiento indefinido al llamar a las rutinas de maldiciones antes de que se realice la inicialización correcta, lo que lleva al bloqueo.

(Buen consejo de dmckee: ayudó a sacar la línea de enlace de acidzombie24, lo cual era importante).

Para llegar a un punto en el que se pueda leer una sola pulsación de tecla y el programa finalice limpiamente, debe hacer un buen trabajo en Unix (OSX, Linux). Tendría que atrapar el estado inicial del terminal, organizar una función <=>, o algún mecanismo similar, para restaurar el estado del terminal, cambiar el terminal del modo cocinado al modo sin procesar, luego invocar una función para leer un carácter (posiblemente solo <=>), y haga su salida. Puede haber otras formas de hacerlo, pero ciertamente implicará algunas operaciones de configuración y desmontaje.

Un libro que podría ayudar es Programación avanzada de Unix, 2.ª edición por Mark Rochkind; Cubre el manejo de terminales en el nivel necesario. Alternativamente, puede usar <=> correctamente, eso será más simple que una solución roll-your-own y probablemente más confiable.

Otros consejos

No ha exhibido un

#include <stdio.h>

o

#include <curses.h>

o línea similar. ¿Está seguro de que está vinculando una biblioteca que incluye getch()?

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

#include <iostream>

using namespace std;

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

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

El programa esperaría a que presione una tecla.

Una vez que lo haya hecho, la tecla que presionó se imprimirá en la pantalla.

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 usar system("pause");

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top