在平常用getchar()函数记录输入时通常要按下enter键程序才能执行,例如下面的程序:
int c;
while((c=getchar())!= EOF)
putchar(c); 每次输入一个字符后要按enter才能显示输入的字符c,而且命令行还会回显字符,如果不想用curses.h中的getch()函数,又想捕获在命令行中捕获按键,那么我们可以对终端属性进行简单的设置来达到目的。
#include
#include
#include
int main()
{
int c;
static struct termios oldt, newt;
/* 将当前设置写入oldt。
*/
tcgetattr( STDIN_FILENO, &oldt );
newt = oldt;
/* ICANON 如果在输入中看到"\n"或者EOF,会返回缓冲区内容
* ECHO 用还控制回显
*/
newt.c_lflag &=~(ICANON | ECHO); // 设置新的终端属性
/*
*TCSANOW 告诉函数立即改变终端的STDIN_FILENO属性值
*/
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
// 当输入e时结束循环
while( (c=getchar())!='e' ){
putchar(c);
}
// 恢复终端设置
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
return 0;
} 如果想要回显则可以去掉ECHO, newt.c_lflag &=~( ICANON );
由于采用这样的方法后,getchar会捕获enter键并输出换行,所以我们要用一个自定义的字符控制循环。
关于终端的更多属性信息,可以用man命令查看,例如man termios