Linux-退格键回显(^H^H^H^H)stty/tcgetattr学习

可以通过stty来实现或者在程序中tcgetattr+tcsetattr结合实现。

stty:

stu@ubuntu:~/test1$ stty erase ^H
在bash下:$ stty erase ^?
或者把 stty erase ^? 添加到.bash_profile中。
在csh下:$ stty erase ^H
或者把 stty erase ^H 添加到.cshrc中

tcgetattr+tcsetattr:

问题描述:

int main(void )
{
//setstty();
char buf[100];
read(STDIN_FILENO,buf,sizeof(buf));
write(STDOUT_FILENO,buf,strlen(buf));
//renew();
return 0;
}
//结果,输入hello(连按几个退格键"backspace",
//出现的效果不是我们想要的,我们希望按下退格键就是删除前一个字符)
/*
stu@ubuntu:~/test1$ ./test
hello^H^H^H^H
hello
stu@ubuntu:~/test1$
*/

大概介绍:

int tcgetattr(int fd, struct termios *termios_p);
int tcsetattr(int fd, int optional_actions,
const struct termios *termios_p);
//说明:tcgetattr函数用于获取与终端相关的参数。参数fd为终端的文件描述符,返回的结果保存在termios结构体中,
//tcsetattr函数用于设置终端的相关参数。参数fd为打开的终端文件描述符,
//参数optional_actions用于控制修改起作用的时间,而结构体termios_p中保存了要修改的参数
//termios结构至少包括以下:
tcflag_t c_iflag; //输入模式标志,控制终端输入方式
tcflag_t c_oflag; //输出模式标志,控制终端输出方式
tcflag_t c_cflag; //控制模式标志,指定终端硬件控制信息
tcflag_t c_lflag; //本地模式标志,控制终端编辑功能
cc_t c_cc[NCCS]; //控制字符,用于保存终端驱动程序

tcgetattr/tcsetattr  API 学习(man):http://linux.die.net/man/3/tcgetattr

tcgetattr/tcsetattr  前人博客学习:http://blog.chinaunix.net/uid-10747583-id-97303.html

主要解决程序退格键回显问题:

1、获取终端termios信息

2、对应的键功能修改

3、完成后设置生效

(4、程序结束前回复系统的默认状态,根据需要决定)


修改终端控制字符,将终端输入退格键“backspace”,修改为具有真正擦出功能,符合我们日常使用习惯。首先,程序调用tcgetattr函数获得标准 输入的termios信息,将termios结构体中的c_cc[VERASE]控制字符的修改成'\b';\b代表“backspace”键.而VERASE代表具有擦除.这样的意思就是将擦除功能赋予'\b'键,也就是"backspace"键然后,使用tcsetattr 函数将修改后的termios参数设置到终端中。

具体实现代码如下

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<termios.h>
#include<errno.h>
 
struct termios tmp, old;
//设置退格键“backspace”为退格键。
void setstty()
{
	//得到系统termion的状态
	if(tcgetattr(STDIN_FILENO, &tmp) == -1)
	{
		printf("tcgetattr error: %s\n", strerror(errno));
		return ;
	}
	old = tmp;
	//'\b'为退格键的ASCII码 因此下面这个语句表示退格键被修改为erase功能,即能擦除
	tmp.c_cc[VERASE] = '\b';
 
	//设置系统termion的状态,TCSANOW表示设置完成效果立即生效
	if(tcsetattr(STDIN_FILENO, TCSANOW, &tmp) == -1)
	{
		printf("tcsetattr error: %s\n", strerror(errno));
		return ;
	}
}
//恢复之前系统默认的状态,回显^H
void renew()
{
	if(tcsetattr(STDIN_FILENO, TCSANOW, &old) == -1)
	{
		printf("tcsetattr error: %s\n", strerror(errno));
		return ;
	}
}
int main(void )
{
	setstty();//设置修改并生效
	char buf[100];
	read(STDIN_FILENO,buf,sizeof(buf));
	write(STDOUT_FILENO,buf,strlen(buf));
	renew(); //恢复系统的默认状态
	return 0;
}


可以通过stty来实现或者在程序中tcgetattr+tcsetattr结合实现。

stty:

stu@ubuntu:~/test1$ stty erase ^H
在bash下:$ stty erase ^?
或者把 stty erase ^? 添加到.bash_profile中。
在csh下:$ stty erase ^H
或者把 stty erase ^H 添加到.cshrc中

tcgetattr+tcsetattr:

问题描述:

int main(void )
{
//setstty();
char buf[100];
read(STDIN_FILENO,buf,sizeof(buf));
write(STDOUT_FILENO,buf,strlen(buf));
//renew();
return 0;
}
//结果,输入hello(连按几个退格键"backspace",
//出现的效果不是我们想要的,我们希望按下退格键就是删除前一个字符)
/*
stu@ubuntu:~/test1$ ./test
hello^H^H^H^H
hello
stu@ubuntu:~/test1$
*/

大概介绍:

int tcgetattr(int fd, struct termios *termios_p);
int tcsetattr(int fd, int optional_actions,
const struct termios *termios_p);
//说明:tcgetattr函数用于获取与终端相关的参数。参数fd为终端的文件描述符,返回的结果保存在termios结构体中,
//tcsetattr函数用于设置终端的相关参数。参数fd为打开的终端文件描述符,
//参数optional_actions用于控制修改起作用的时间,而结构体termios_p中保存了要修改的参数
//termios结构至少包括以下:
tcflag_t c_iflag; //输入模式标志,控制终端输入方式
tcflag_t c_oflag; //输出模式标志,控制终端输出方式
tcflag_t c_cflag; //控制模式标志,指定终端硬件控制信息
tcflag_t c_lflag; //本地模式标志,控制终端编辑功能
cc_t c_cc[NCCS]; //控制字符,用于保存终端驱动程序

tcgetattr/tcsetattr  API 学习(man):http://linux.die.net/man/3/tcgetattr

tcgetattr/tcsetattr  前人博客学习:http://blog.chinaunix.net/uid-10747583-id-97303.html

主要解决程序退格键回显问题:

1、获取终端termios信息

2、对应的键功能修改

3、完成后设置生效

(4、程序结束前回复系统的默认状态,根据需要决定)


修改终端控制字符,将终端输入退格键“backspace”,修改为具有真正擦出功能,符合我们日常使用习惯。首先,程序调用tcgetattr函数获得标准 输入的termios信息,将termios结构体中的c_cc[VERASE]控制字符的修改成'\b';\b代表“backspace”键.而VERASE代表具有擦除.这样的意思就是将擦除功能赋予'\b'键,也就是"backspace"键然后,使用tcsetattr 函数将修改后的termios参数设置到终端中。

具体实现代码如下

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<termios.h>
#include<errno.h>
 
struct termios tmp, old;
//设置退格键“backspace”为退格键。
void setstty()
{
	//得到系统termion的状态
	if(tcgetattr(STDIN_FILENO, &tmp) == -1)
	{
		printf("tcgetattr error: %s\n", strerror(errno));
		return ;
	}
	old = tmp;
	//'\b'为退格键的ASCII码 因此下面这个语句表示退格键被修改为erase功能,即能擦除
	tmp.c_cc[VERASE] = '\b';
 
	//设置系统termion的状态,TCSANOW表示设置完成效果立即生效
	if(tcsetattr(STDIN_FILENO, TCSANOW, &tmp) == -1)
	{
		printf("tcsetattr error: %s\n", strerror(errno));
		return ;
	}
}
//恢复之前系统默认的状态,回显^H
void renew()
{
	if(tcsetattr(STDIN_FILENO, TCSANOW, &old) == -1)
	{
		printf("tcsetattr error: %s\n", strerror(errno));
		return ;
	}
}
int main(void )
{
	setstty();//设置修改并生效
	char buf[100];
	read(STDIN_FILENO,buf,sizeof(buf));
	write(STDOUT_FILENO,buf,strlen(buf));
	renew(); //恢复系统的默认状态
	return 0;
}


猜你喜欢

转载自blog.csdn.net/ffzhihua/article/details/80967566
h'h
今日推荐