在普通的C中,如何检查标准输入是否有未阻塞的字节?
这样做的原因是处理多字节的转义序列。
例如,如果我使用getchar()
并且用户按下Ctrl-Up Arrow,则会立即将3个字节放在标准输入中:1B 4F 41,但是getchar()
只读取其中一个字节。在继续之前我需要阅读所有三个。不同的转义序列具有不同的长度,因此逻辑是如果第一个字符是转义字符,那么我读取当前在缓冲区中的所有字符,然后将其作为转义单元处理。但我不能用getchar()
做到这一点,因为它会在到达缓冲区末尾时阻塞。我需要知道缓冲区中有多少个字符。
答案 0 :(得分:1)
标准C中没有此类规定;您需要使用特定于操作系统的调用来执行非阻塞读取,或者我认为更合适的是立即从输入读取字节而不是等待换行。对于后者,请参阅
setvbuf not able to make stdin unbuffered
注意:
逻辑是如果第一个字符是转义字符,那么我读取当前缓冲区中的所有字符,然后将其作为转义单元处理
这实际上并不是这样做的,如果快速按下或自动重复按键,或者说,您正在从密钥日志文件中读取,则会失败。每个字节确定有多少字节的转义序列;你应该根据你已经看到的情况有条不紊地阅读。