C select() timeout STDIN单字符(无ENTER)
C select() timeout STDIN single char (no ENTER)
我希望能够使用select()
从STDIN输入单个字符(没有ENTER)。
因此,当用户按下单个键时,select()
应该立即返回,而不是等待用户按ENTER。
int main(void)
{
fd_set rfds;
struct timeval tv;
int retval;
/* Watch stdin (fd 0) to see when it has input. */
FD_ZERO(&rfds);
FD_SET(0, &rfds);
/* Wait up to 2 seconds. */
tv.tv_sec = 2;
tv.tv_usec = 0;
retval = select(1, &rfds, NULL, NULL, &tv);
if (retval == -1)
perror("select()");
else if (retval)
printf("Data is available now.n");
else
printf("No data within five seconds.n");
exit(EXIT_SUCCESS);
}
这是可行的,但是你必须按回车键才能完成。我只是想要选择,而不是等待用户按下键和ENTER。
谢谢。
我相信,当一个键被输入到终端时,它被缓冲,直到你按ENTER,也就是说,就程序而言,你没有输入任何东西。你可能想快速看一下这个问题
在unix风格的环境中,这可以通过termios
函数来完成。
你需要禁用规范模式,这是一个终端特性,允许在程序看到输入之前进行行编辑。
#include <termios.h>
#include <unistd.h>
int main(int argc, char **argv)
{
/* Declare the variables you had ... */
struct termios term;
tcgetattr(0, &term);
term.c_iflag &= ~ICANON;
term.c_cc[VMIN] = 0;
term.c_cc[VTIME] = 0;
tcsetattr(0, TCSANOW, &term);
/* Now the rest of your code ... */
}
捕获可能来自tcgetattr
和tcsetattr
调用的错误留给读者作为练习。
相关文章:
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 指向指向字符数组的指针数组的指针
- 如何用转义符替换字符串中的所有特殊字符
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 比较字符数组
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 当您按"Enter"键时,Windows超级终端下发送哪些字符
- 我想检测用户在按下 Enter 之前是否输入了字符
- 如何在不按ENTER和不使用getch()或getche()的情况下读取C++中的字符
- C select() timeout STDIN单字符(无ENTER)
- c++:按ENTER键前读取字符