如何使用getchar读取多字符键盘符号?

时间:2019-04-25 01:23:25

标签: c unix terminal io

我在原始模式下使用终端,问题是某些按键返回一个int,而其他按键返回两个int。例如,“ A”的getchar()为65,但是如果用户按Alt-D,则getchar()将返回27和100。功能键甚至可以返回三个代码。例如,“ F4”在我的终端上生成27 79 83。因此,多字节序列始终以27开始,但是此后可能是一两个字符。

这是一个问题,因为如果我在一个字符后停止读取,则缓冲区中将留下其他代码,因此下次输入循环再次启动时,它将读取并获得错误的值。因此,例如,在上述情况下,如果用户按F4键,则83将保留在缓冲区中,以后将被读取为字符“ S”。

另一方面,如果我尝试读取三个字符,则由于getchar()是阻塞调用,如果转义序列仅包含两个字符,则输入循环将挂起。

我需要调用getchar(),如果我得到一个转义符(27),那么我需要某种方式来读取缓冲区中剩余的所有字符,并且在执行此操作时不会阻塞。

1 个答案:

答案 0 :(得分:1)

您只需要检查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...
}