linux命令行下用getchar()函数捕获按键

在平常用getchar()函数记录输入时通常要按下enter键程序才能执行,例如下面的程序:

int c;   
 while((c=getchar())!= EOF)      
    putchar(c);
每次输入一个字符后要按enter才能显示输入的字符c,而且命令行还会回显字符,如果不想用curses.h中的getch()函数,又想捕获在命令行中捕获按键,那么我们可以对终端属性进行简单的设置来达到目的。

#include <stdio.h>
#include <termios.h>
#include <unistd.h>

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

你可能感兴趣的:(getchar;linux终端)