Эквивалентно Windows getch () для Mac / Linux сбоев

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

int main()
{
    getch();
}

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

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

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


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

Обратите внимание, что cout - это конструкция C++. Хотя пока что ответы в основном касаются C, они также применимы к C++. И std :: cin.get () зависнет в ожидании строки ввода терминала - синдром Hit Enter - так же, как и getchar () или любая другая стандартная функция ввода-вывода.

Jonathan Leffler 06.11.2008 04:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
1
20 268
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

#include <stdio.h>

или же

#include <curses.h>

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

связывание / компиляция не проблема, я включаю curses и do -lcurses в xcode. окно использует conio.h

user34537 06.11.2008 04:04
Ответ принят как подходящий

Вы смотрели в <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();

Jose Munoz 02.07.2013 03:29

Пожалуйста, воздержитесь от советов по звонкам system(). Это плохая практика программирования и имеет серьезные побочные эффекты.

user2064000 12.08.2013 10:20

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

#include <iostream>

using namespace std;

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

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

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

Как только вы это сделаете, нажатая клавиша будет распечатана на экране.

Или просто используйте функцию getchar ()

Benjamin 22.06.2017 02:24

Другие вопросы по теме