在纯 C 语言中,如何在不阻塞的情况下检查标准输入是否有待处理的字节?
这样做的原因是处理多字节的转义序列。
例如,如果我使用 getchar()
并且用户按下 Ctrl-Up Arrow,那么 3 个字节会立即放入标准输入:1B 4F 41,但是 getchar()
只读取其中一个字节。在继续之前,我需要阅读所有这三个。不同的转义序列具有不同的长度,所以逻辑是如果第一个字符是转义字符,那么我读取当前缓冲区中的所有字符,然后将其作为转义单元处理。但是我不能用 getchar()
来做到这一点,因为它会在到达缓冲区末尾时阻塞。我需要知道缓冲区中有多少个字符。
最佳答案
标准C中没有这样的规定;您需要使用特定于操作系统的调用来进行非阻塞读取,或者我认为在这里更合适的是立即从输入中读取字节而不是等待换行符。对于后者,参见
setvbuf not able to make stdin unbuffered
注意:
the logic is that if the first character is an escape character then I read ALL characters currently in the buffer and then process that as an escape unit
这真的不是这样做的方法,如果按键被快速按下或被自动重复,或者说,你正在从一个按键日志文件中读取,将会失败。每个字节决定了还有多少字节的转义序列;你应该根据你已经看过的内容有条件地阅读。
关于检查 stdin 是否有待处理的字节(用于转义序列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26390720/