Эквивалентно сбою Windows getch () для Mac / Linux - PullRequest
10 голосов
/ 06 ноября 2008

Я использую getch(), и мое приложение мгновенно падает. В том числе при выполнении:

int main()
{
    getch();
}

Я не могу найти ссылку, но, предположительно, проблема в том, что она должна отключить буферизацию или что-то странное в этом направлении, и я все еще хочу, чтобы cout работал вместе с кроссплатформенным кодом.

Мне сказали использовать std::cin.get(), но я бы хотел, чтобы приложение закрывалось при нажатии клавиши, а не когда пользователь вводил букву или цифру, а затем нажимал ввод для выхода.

Есть ли какая-нибудь функция для этого? Код должен работать под Mac (моя ОС) и Windows.


Связывание / компиляция не является проблемой ; Я включаю <curses.h> и ссылку с -lcurses в XCode, в то время как Windows использует <conio.h>.

Ответы [ 4 ]

11 голосов
/ 06 ноября 2008

Вы смотрели в <curses.h>, чтобы увидеть, что делает функция getch()?

Подсказка: OSX и Linux не совпадают с Windows.

В частности, в качестве макроса в <curses.h> мы находим:

#define getch() wgetch(stdscr)

Теперь в вашей системе появляется действительная функция getch() в библиотеке curses, но она ожидает установки stdscr, и это делается с помощью функций инициализации curses (initscr() и родственники), и это не сделано вашим кодом. Итак, ваш код вызывает неопределенное поведение, вызывая процедуры curses до того, как будет выполнена правильная инициализация, что приведет к сбою.

(Хороший совет от dmckee - это помогло получить линию связи из acidzombie24, что было важно.)

Чтобы добраться до точки, где можно прочитать одно нажатие клавиши и программа завершается без ошибок, вам нужно проделать большую работу в Unix (OSX, Linux). Вы должны были бы перехватить начальное состояние терминала, организовать функцию atexit() или какой-либо подобный механизм - для восстановления состояния терминала, перевести терминал из готового режима в необработанный режим, а затем вызвать функцию для чтения персонаж (возможно, просто read(0, &c, 1)), и сделать свой выход. Могут быть и другие способы сделать это, но это, безусловно, потребует некоторых операций настройки и демонтажа.

Одна книга, которая может помочь, это Расширенное программирование Unix, 2-е издание , Марк Рочкинд; он охватывает обработку терминала на необходимом уровне. В качестве альтернативы, вы можете использовать <curses.h> правильно - это будет проще, чем решение по принципу «сделай сам», и, возможно, будет более надежным.

2 голосов
/ 06 ноября 2008

Вы еще не выставили

#include <stdio.h>

или

#include <curses.h>

или аналогичная строка. Вы уверены, что ссылаетесь на библиотеку, которая включает getch()?

0 голосов
/ 22 июня 2017

Используйте функцию cin.get (), например:

#include <iostream>

using namespace std;

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

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

Затем программа будет ждать, пока вы нажмете клавишу.

После этого нажатая клавиша будет выведена на экран.

0 голосов
/ 28 июня 2013

Функция getch недоступна в Unix-подобных системах, но вы можете заменить ее консольными командами через компилятор с функцией system.

Использование:

В Windows вы можете использовать system("pause");

В Unix-подобных системах (например, OSX) вы можете использовать system("read -n1 -p ' ' key");

Примечание: system объявлено в <stdlib.h>.

...