博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux-退格键回显(^H^H^H^H)stty/tcgetattr学习【转】
阅读量:2185 次
发布时间:2019-05-02

本文共 2301 字,大约阅读时间需要 7 分钟。

(转自:)

这个问题确实挺揪心,退格键(“backspace”)居然是^H^H,不符合我们使用习惯,我们平常使用退格键都习惯删除上一个字符。

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

stty:

 

 
  1. stu@ubuntu:~/test1$ stty erase ^H

  2. 在bash下:$ stty erase ^?

  3. 或者把 stty erase ^? 添加到.bash_profile中。

  4. 在csh下:$ stty erase ^H

  5. 或者把 stty erase ^H 添加到.cshrc中

 

 

 

tcgetattr+tcsetattr:

 

问题描述:

 

 
  1. int main(void )

  2. {

  3. //setstty();

  4. char buf[100];

  5. read(STDIN_FILENO,buf,sizeof(buf));

  6. write(STDOUT_FILENO,buf,strlen(buf));

  7. //renew();

  8. return 0;

  9. }

  10.  
  11. //结果,输入hello(连按几个退格键"backspace",

  12. //出现的效果不是我们想要的,我们希望按下退格键就是删除前一个字符)

  13. /*

  14. stu@ubuntu:~/test1$ ./test

  15. hello^H^H^H^H

  16. hello

  17. stu@ubuntu:~/test1$

  18. */

 

 

大概介绍:

 

 
  1. int tcgetattr(int fd, struct termios *termios_p);

  2. int tcsetattr(int fd, int optional_actions,

  3. const struct termios *termios_p);

  4. //说明:tcgetattr函数用于获取与终端相关的参数。参数fd为终端的文件描述符,返回的结果保存在termios结构体中,

  5. //tcsetattr函数用于设置终端的相关参数。参数fd为打开的终端文件描述符,

  6. //参数optional_actions用于控制修改起作用的时间,而结构体termios_p中保存了要修改的参数

  7. //termios结构至少包括以下:

  8. tcflag_t c_iflag; //输入模式标志,控制终端输入方式

  9. tcflag_t c_oflag; //输出模式标志,控制终端输出方式

  10. tcflag_t c_cflag; //控制模式标志,指定终端硬件控制信息

  11. tcflag_t c_lflag; //本地模式标志,控制终端编辑功能

  12. cc_t c_cc[NCCS]; //控制字符,用于保存终端驱动程序

  13.  

 

 

tcgetattr/tcsetattr  API 学习(man):

tcgetattr/tcsetattr  前人博客学习:

 

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

1、获取终端termios信息

2、对应的键功能修改

3、完成后设置生效

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

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

具体实现代码如下:

 

 
  1. #include<stdio.h>

  2. #include<stdlib.h>

  3. #include<string.h>

  4. #include<unistd.h>

  5. #include<termios.h>

  6. #include<errno.h>

  7.  
  8. struct termios tmp, old;

  9. //设置退格键“backspace”为退格键。

  10. void setstty()

  11. {

  12. //得到系统termion的状态

  13. if(tcgetattr(STDIN_FILENO, &tmp) == -1)

  14. {

  15. printf("tcgetattr error: %s\n", strerror(errno));

  16. return ;

  17. }

  18. old = tmp;

  19. //'\b'为退格键的ASCII码 因此下面这个语句表示退格键被修改为erase功能,即能擦除

  20. tmp.c_cc[VERASE] = '\b';

  21.  
  22. //设置系统termion的状态,TCSANOW表示设置完成效果立即生效

  23. if(tcsetattr(STDIN_FILENO, TCSANOW, &tmp) == -1)

  24. {

  25. printf("tcsetattr error: %s\n", strerror(errno));

  26. return ;

  27. }

  28. }

  29. //恢复之前系统默认的状态,回显^H

  30. void renew()

  31. {

  32. if(tcsetattr(STDIN_FILENO, TCSANOW, &old) == -1)

  33. {

  34. printf("tcsetattr error: %s\n", strerror(errno));

  35. return ;

  36. }

  37. }

  38. int main(void )

  39. {

  40. setstty();//设置修改并生效

  41. char buf[100];

  42. read(STDIN_FILENO,buf,sizeof(buf));

  43. write(STDOUT_FILENO,buf,strlen(buf));

  44. renew(); //恢复系统的默认状态

  45. return 0;

  46. }

转载地址:http://nyqkb.baihongyu.com/

你可能感兴趣的文章
Centos7 离线安装RabbitMQ,并配置集群
查看>>
Centos7 or Other Linux RPM包查询下载
查看>>
运行springboot项目出现:Type javax.xml.bind.JAXBContext not present
查看>>
Java中多线程向mysql插入同一条数据冲突问题
查看>>
Idea Maven项目使用jar包,添加到本地库使用
查看>>
FastDFS集群架构配置搭建(转载)
查看>>
HTM+CSS实现立方体图片旋转展示效果
查看>>
FFmpeg 命令操作音视频
查看>>
问题:Opencv(3.1.0/3.4)找不到 /opencv2/gpu/gpu.hpp 问题
查看>>
目的:使用CUDA环境变量CUDA_VISIBLE_DEVICES来限定CUDA程序所能使用的GPU设备
查看>>
问题:Mysql中字段类型为text的值, java使用selectByExample查询为null
查看>>
程序员--学习之路--技巧
查看>>
解决问题之 MySQL慢查询日志设置
查看>>
contOS6 部署 lnmp、FTP、composer、ThinkPHP5、docker详细步骤
查看>>
TP5.1模板布局中遇到的坑,配置完不生效解决办法
查看>>
PHPstudy中遇到的坑No input file specified,以及传到linux环境下遇到的坑,模板文件不存在
查看>>
TP5.1事务操作和TP5事务回滚操作多表
查看>>
composer install或composer update 或 composer require phpoffice/phpexcel 失败解决办法
查看>>
TP5.1项目从windows的Apache服务迁移到linux的Nginx服务需要注意几点。
查看>>
win10安装软件 打开时报错 找不到 msvcp120.dll
查看>>