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

问题描述 投票:0回答:1

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

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

另一方面,如果我尝试读取三个字符,那么如果转义序列只有两个字符,则输入循环将挂起,因为getchar()是一个阻塞调用。

我需要的是调用getchar(),如果我得到一个转义(27),那么我需要一些方法来读取缓冲区中剩余的所有字符,而不是阻塞这样做。

c unix terminal io
1个回答
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...
}
© www.soinside.com 2019 - 2024. All rights reserved.