【问题标题】:How to read multi-char keysyms with getchar?如何使用 getchar 读取多字符键符?
【发布时间】:2019-09-14 08:54:49
【问题描述】:

我在原始模式下使用终端,问题是某些按键返回一个 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】:

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

    【讨论】:

    • getchar 块,所以如果我这样做,我的程序会挂起
    • @TylerDurden 请记住检查 previous 调用@987654325 的结果@ 在再次调用getchar 之前。它只是一组嵌套的if 语句。
    • 我无法知道特定的转义序列是 2 个还是 3 个字符。
    • @TylerDurden 每个密钥应该为代码生成的内容应该有很好的文档记录,并且可以从 Internet 上获取。
    猜你喜欢
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多