Когда я создавал приложение PDCurses, я столкнулся с проблемой, когда, пока я ждал ввода, оно просто зависало и не передавало никаких данных программе, даже если технически оно все еще считывало ввод. Мне удалось свести это к следующему коду:

#include <curses.h>

main()
{
    initscr(); // initialize screen
    noecho(); // don't echo the keys to the screen
    cbreak(); // no waiting for enter key
    clear(); // clear screen

    while (getch() != 13) // loop until they press ENTER
        mvaddch(0, 0, 'a'); // GETS PAST HERE

    getch(); // HANGS; WINDOWS IS RECEIVING INPUT FROM THE KEYBOARD (turn off noecho()), BUT NEVER RETURNS IT TO THE ACTUAL PROGRAM

    return 0;
}

Чтобы поместить это в контекст того, как это было отображено в моей программе, у меня был цикл в main(), который бесконечно вызывал функцию, которая отображала бы меню, пока не была нажата клавиша ENTER. Однако, если пользователь нажал определенную клавишу, находясь в меню, он вызовет другое меню и получит ввод от этой функции. В приведенном выше коде я упростил его, выполнив два последующих вызова getch().

У меня вопрос, почему он зависает только после проверки цикла по клавише ENTER ?? Разве это не должно быть просто?

Кроме того, мое приложение PDCurses работает на Windows cmd. (13 = ENTER; KEY_ENTER здесь не работает)

0
Sergix 9 Июн 2018 в 03:56

1 ответ

Лучший ответ

При нажатии клавиши ENTER getch() возвращает 10 (LF), а не 13 (CR). Таким образом, второй getch() никогда не достигается. Это не относится к PDCurses или Windows. Вы можете изменить поведение PDCurses в этом отношении, вызвав raw(), но это может быть специфичным для PDCurses.

1
William McBrine 9 Июн 2018 в 12:10