C 语言捕获 BackSpace 键盘操作

问题来源

《C.P.L》习题1-10, 捕获后退操作,即,点击 backspace, 则输出 "\b"。

Windows 下非标准函数 <conio.h> 中的 getch() 函数可以实现此功能。但 Linux 下需要自己写一个类似的函数。

  • 参考: http://cboard.cprogramming.com/faq-board/27714-faq-there-getch-conio-equivalent-linux-unix.html

Backspace 在不同的键盘下,ASCII 码可能不一样。可能是 8 或者 127。

  • 参考:http://www.52rd.com/Blog/Detail_RD.Blog_imjacob_12608.html

代码实现:

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

#define ESC_CHAR '\\'

int mygetch() {
    struct termios oldt,
                   newt;

    int            ch;

    tcgetattr( STDIN_FILENO, &oldt );
    newt = oldt;
    newt.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newt );
    ch = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt );

    return ch;
}


int main(void)
{
    int c;

    while((c = mygetch()) != EOF  && c != 'q')
    {

        switch(c)
        {
            /* different keyboard, may have different ascii for backspace */
            case 127:
                putchar(ESC_CHAR);
                putchar('b');
                putchar('\n');
                break;

            /* different keyboard, may have different ascii for backspace */
            case 8:
                putchar(ESC_CHAR);
                putchar('b');
                putchar('\n');
                break;

               case 9:
                putchar(ESC_CHAR);
                putchar('t');
                putchar('\n');
                break;

            case ESC_CHAR:
                putchar(ESC_CHAR);
                putchar(ESC_CHAR);
                putchar('\n');
                break;

            default:
                printf("string=%c,ascii=%d.",c,c);
                putchar('\n');
                break;
        }
    }

    return 0;
}

$ ./a.out
string=a,ascii=97.
string=i,ascii=105.
\\
\b
\t

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
最近更新: 10/7/2018, 7:49:52 PM