Вы смотрели в <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>
правильно - это будет проще, чем решение по принципу «сделай сам», и, возможно, будет более надежным.