博客文章

Linux 中Backspace回显^H的解决办法

作者: andy.      时间: 2016-10-12 10:18:49

Linux 中写程序,要求用户输入的时候,在键入Backspace的时候出现^H。。解决的方案有两种。

第一种直接:

stty erase ^H

取消Backspace的回显。简单粗暴~

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
 
void main(){
        system("stty erase ^H");
        char buf[1024];
        memset(buf, 0, 1024);
 
        printf("请输入:");
        fflush(stdout);
        read(STDIN_FILENO, buf, 1024);
        write(STDOUT_FILENO, buf, strlen(buf));
}

第二种方法感觉就有些麻烦了。

1、先通过tcgetattr获取到系统的termion设置。

2、修改termion的设置,将对应的特殊字符设置为想要的ASCII码。调用tcsetattr进行设置。

3、使用完成后再次调用tcsetattr设置为原来系统的设置。

看代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
 
void main(){
        struct termios term, oldterm;
        if(tcgetattr(STDIN_FILENO, &term) == -1){
                perror("1");
                exit(-1);
        }
 
        oldterm = term;
 
        char buf[1024];
        memset(buf, 0, 1024);
 
        printf("请输入:");
        fflush(stdout);
        read(STDIN_FILENO, buf, 1024);
        
        term.c_cc[VERASE] = '\b';//term.c_cc是一个数组,里面包含了特殊字符的行为。VERASE代表的是Backspace,把设置为退格键。
        if(tcsetattr(STDIN_FILENO, TCSANOW, &term) == -1){/TCSAFLUSH立即生效。
                perror("2");
                exit(-1);
        }
 
        memset(buf, 0, 1024);
 
        printf("请输入:");
        fflush(stdout);
        read(STDIN_FILENO, buf, 1024);
        write(STDOUT_FILENO, buf, strlen(buf));
 
        if(tcsetattr(STDIN_FILENO, TCSANOW, &oldterm) == -1){//修改完后改回原系统设置。
                perror("3");
                exit(-1);
        }
}

输出结果:


blob.png


PS:代码一定要好好保存,前两天发现一段很重要的代码从虚拟机里面消失了。。