我们知道getchar()函数可以读取一个字符,但是必须在按下回车键之后字符才会从缓冲区送给程序。如何在linux终端里实现无回显读取字符呢?下面的代码给出了一个简单有效的实现。
#include<stdio.h>
#include<unistd.h>
#include<termios.h>
int main(){
int input;
struct termios save, current;
tcgetattr(0, &save);// 得到原来的终端属性
current = save;
current.c_lflag &= ~ICANON;// 设置非正规模式,如果程序每次要从终端读取一个字符的话,这是必须的
current.c_lflag &= ~ECHO;// 关闭回显
current.c_cc[VMIN] = 1;// 设置非正规模式下的最小字符数
current.c_cc[VTIME] = 0;// 设置非正规模式下的读延时
tcsetattr(0, TCSANOW, ¤t);// 设置新的终端属性
printf("input your data:\n");
while((input = getchar()) != 'q'){
printf("input=%c\n", input);
}
tcsetattr(0, TCSANOW, &save);// 恢复原来的终端属性,以免干扰shall和之后的程序运行
return 0;
}
参考资料:
termios结构体: