C: ncurses, initscr() меняет поведение getchar()?

Я просто играю с ncurses и так далее, и я обнаружил действительно странное поведение.

Когда я использую initscr() из библиотеки ncurses, а затем использую обычный getchar(), программа завершается после нажатия первой клавиши.

Нормальное поведение getchar(), которое я ожидаю, заключается в том, что я могу печатать (более или менее) до тех пор, пока не нажму клавишу возврата.

#include "curses.h"

int main()
{
    initscr();
    getchar();
  //endwin();

    return 0;
}

Может ли кто-нибудь объяснить мне, почему это происходит?


person Reppiz    schedule 14.10.2017    source источник
comment
Запишите и отобразите значение из getchar() перед выходом. Включите endwin(), если вам не нравится сбрасывать характеристики терминала (или, я полагаю, если вы не используете IDE, которая создает новое окно терминала при запуске программы). Когда вы используете initscr() или подобное, вы меняете правила для стандартного ввода. Не ожидайте нормального поведения; правила изменились.   -  person Jonathan Leffler    schedule 15.10.2017
comment
Вы можете найти хороший пример и многое другое для своей ситуации в https://stackoverflow.com/questions/10256477/getch-and-putchar-not-working-without-return.   -  person Claudio Borges    schedule 15.10.2017


Ответы (1)


curses инициализирует входные данные терминала в необработанный режим (который, в свою очередь, заставляет подключенный поток вести себя так, как если бы он был небуферизованным), так что curses может обнаруживать односимвольный ввод. getchar предполагает, что ввод буферизован, поэтому для завершения строки ввода необходимо нажать Enter. В необработанном режиме getchar возвращается сразу же, потому что вызов read найдет что-то, как только вы нажмете клавишу.

Помимо endwin, вы можете использовать другие функции curses для переключения между сырым и приготовленным режимами терминала (см. руководство для reset_shell_mode и reset_prog_mode).

person Thomas Dickey    schedule 14.10.2017
comment
Это неправильно. Буферизация Stdio не имеет к этому никакого отношения. Скорее речь идет о приготовленном/каноническом режиме на tty. Кроме того, getchar не предполагает, что ввод буферизуется, и не делает ничего плохого после того, как терминал установлен в режим «сырой». - person R.. GitHub STOP HELPING ICE; 15.10.2017