Equivalente ao Windows getch () para falhas no Mac / Linux
Pergunta
Eu estou usando getch()
e meu aplicativo trava instantaneamente. Incluindo ao fazer:
int main()
{
getch();
}
Não consigo encontrar o link, mas supostamente o problema é que ele precisa para desligar o buffer ou algo estranho nesse sentido, e eu ainda quero cout
ao trabalho juntamente com o código de plataforma cruzada.
Foi-me dito para uso std::cin.get()
, mas eu gostaria que o aplicativo para sair quando uma tecla é pressionada, não quando o usuário digitou uma letra ou número, em seguida, pressione Enter para sair.
Existe alguma função para isso? O trabalho de código must sob Mac (meu SO) e Windows.
Linking / compilação não é uma questão ; I incluem <curses.h>
e ligação com -lcurses
no XCode, enquanto o Windows usa <conio.h>
.
Solução
Você já olhou em <curses.h>
para ver o que a função getch()
faz?
Dica: OSX e Linux não são o mesmo que o Windows
. Especificamente, como uma macro na <curses.h>
, encontramos:
#define getch() wgetch(stdscr)
Agora, parece, no seu sistema, para ser um getch()
função real na biblioteca maldições, mas espera que stdscr
para ser configurado, e que é feito pelas maldições inicialização funções (initscr()
e parentes), e que é signally não feito por seu código. Assim, seu código está invocando um comportamento indefinido chamando maldições rotinas antes da inicialização correto é feito, levando ao acidente.
(Boa dica do dmckee - ele ajudou a obter a linha de ligação para fora da acidzombie24, que era importante.)
Para chegar a um ponto em que uma única chave-acidente vascular cerebral pode ser lido e o programa terminou de forma limpa, você tem que fazer uma boa dose de trabalho no Unix (OSX, Linux). Você teria que prender o estado inicial do terminal, mandar para uma função atexit()
- ou algum mecanismo semelhante - para restaurar o estado do terminal, mudar o terminal de modo cozidos em modo cru, em seguida, chamar uma função para ler um caractere ( possivelmente apenas read(0, &c, 1)
), e fazer a sua saída. Pode haver outras maneiras de fazê-lo -. Mas certamente envolverá algumas operações de configuração e desmontagem
Um livro que pode ajudar é Avançada Unix Programming, 2a ed por Mark Rochkind; ele cobre manipulação do terminal no nível necessário. Alternativamente, você pode usar <curses.h>
corretamente -. Que será mais simples do que uma solução roll-seu-próprio, e provavelmente mais confiável
Outras dicas
Você não tem exibiu um
#include <stdio.h>
ou
#include <curses.h>
ou linha similar. Tem certeza que você está ligando contra uma biblioteca que inclui getch()
?
Use o cin.get () função, por exemplo:
#include <iostream>
using namespace std;
int main()
{
char input = cin.get();
cout << "You Pressed: " << input;
}
O programa, então, esperar que você pressionar uma tecla.
Uma vez que você tem, a chave que você pressionou seria impresso para a tela.
A função getch
não está disponível em sistemas Unix-like, mas você pode substituí-lo com comandos do console através de seu compilador com a função system
.
Uso:
No Windows, você pode usar system("pause");
Em Unix-like sistemas (como OSX) você pode usar system("read -n1 -p ' ' key");
Nota:. system
é declarado em <stdlib.h>