Как читать мульти-символьные ключи с помощью getchar? - PullRequest
0 голосов
/ 25 апреля 2019

Я использую терминал в необработанном режиме, и проблема в том, что некоторые нажатия клавиш возвращают один int, а другие возвращают два.Например, getchar () для 'A' равен 65, но если пользователь нажимает Alt-D, тогда getchar () возвращает 27 и 100. Функциональные клавиши могут даже возвращать три кода.Например, «F4» генерирует 27 79 83 на моем терминале.Итак, многобайтовые последовательности всегда начинаются с 27, но после этого могут быть один или два символа.

Это проблема, потому что если я перестану читать после одного символа, тогда в буфере останется другой код,поэтому в следующий раз мой цикл ввода снова запустится, затем он прочитает его и получит ошибочное значение.Так, например, в приведенном выше случае, если пользователь нажимает клавишу F4, 83 будет оставлен в буфере и позже будет считан как символ «S».

С другой стороны, если я попытаюсьпрочитайте три символа, тогда цикл ввода будет зависать, если escape-последовательность содержит только два символа, потому что getchar () является блокирующим вызовом.

Мне нужно вызвать getchar (), и если я получу escape (27), тогда мне нужно каким-то образом прочитать все символы, оставшиеся в буфере, а не блокировать при этом.

1 Ответ

1 голос
/ 25 апреля 2019

Вы просто должны проверить, что возвращает getchar.Если это 27, вам нужно прочитать хотя бы еще один символ.Используйте getchar, чтобы прочитать его, и снова проверьте, что он возвратил, чтобы узнать, нужно ли вам читать еще раз.


Что-то вроде

int ch;  // The getchar function returns an int (important for EOF check)

if ((ch = getchar()) == 27)
{
    // Escape read, there's more characters to read
    if ((ch = getchar()) == 79)
    {
        // It's a function key, there's one more characters to read
        ch = getchar();

        // Check which function key was input
        switch (ch)
       {
       case 83:
           // F4...
           break;

        //...

        default:
            // Unknown key...
        }
    }
    else
    {
        // Not a function key, perhaps Alt-D?
        if (ch == 100)
        {
            // ...
        }
    }
}
else
{
    // Not escape, a normal key...
}
...