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>.

Foi útil?

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>

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top