Я использую getch(), и мое приложение сразу вылетает. В том числе при выполнении:
int main()
{
getch();
}
Я не могу найти ссылку, но, предположительно, проблема в том, что ей нужно отключить буферизацию или что-то странное в этих строках, и я все еще хочу, чтобы cout работал вместе с кроссплатформенным кодом.
Мне сказали использовать std::cin.get(), но я бы хотел, чтобы приложение закрывалось при нажатии клавиши, а не когда пользователь вводил букву или цифру, а затем нажимал клавишу ВВОД, чтобы выйти.
Есть ли для этого какая-нибудь функция? Код должен работать под Mac (моя ОС) и Windows.
Связывание / компиляция - это не проблема; Я включаю <curses.h> и связываю с -lcurses в XCode, в то время как Windows использует <conio.h>.





Вы не выставляли
#include <stdio.h>
или же
#include <curses.h>
или аналогичная строка. Вы уверены, что делаете линковку с библиотекой включает в себяgetch()?
связывание / компиляция не проблема, я включаю curses и do -lcurses в xcode. окно использует conio.h
Вы смотрели в <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> - это будет проще, чем самостоятельное решение, и, вероятно, более надежно.
Функция getch недоступна в Unix-подобных системах, но вы можете заменить ее консольными командами через компилятор с функцией system.
Использование:
В Windows вы можете использовать system("pause");
В Unix-подобных системах (например, OSX) вы можете использовать system("read -n1 -p ' ' key");
Примечание: system заявлен в <stdlib.h>.
это приостановит вашу программу, пока пользователь не нажмет клавишу - любую клавишу - так же, как в getch();
Пожалуйста, воздержитесь от советов по звонкам system(). Это плохая практика программирования и имеет серьезные побочные эффекты.
Используйте, например, функцию cin.get ():
#include <iostream>
using namespace std;
int main()
{
char input = cin.get();
cout << "You Pressed: " << input;
}
Затем программа будет ждать, пока вы нажмете клавишу.
Как только вы это сделаете, нажатая клавиша будет распечатана на экране.
Или просто используйте функцию getchar ()
Обратите внимание, что cout - это конструкция C++. Хотя пока что ответы в основном касаются C, они также применимы к C++. И std :: cin.get () зависнет в ожидании строки ввода терминала - синдром Hit Enter - так же, как и getchar () или любая другая стандартная функция ввода-вывода.