C语言如何读取esc

C语言如何读取esc

作者:William Gu发布时间:2026-03-04阅读时长:0 分钟阅读次数:1

用户关注问题

Q
在C语言中如何检测Esc键的按下事件?

我想在C语言程序中捕捉Esc键的按下,但不清楚应该使用什么函数或方法来实现这个功能?

A

使用getch()函数检测Esc键

可以使用conio.h库中的getch()函数读取键盘输入,Esc键对应的ASCII码是27。当getch()返回27时,即表示Esc键被按下。示例代码如下:

#include <stdio.h>
#include <conio.h>

int main() {
    char ch;
    printf("按下Esc键退出程序。\n");
    while(1) {
        ch = getch();
        if(ch == 27) {  // 27是Esc键的ASCII码
            printf("检测到Esc键,程序结束。\n");
            break;
        }
    }
    return 0;
}
Q
如何在Linux环境下使用C语言读取Esc键?

我在Linux系统使用C语言编程,想读取Esc键,但是conio.h库不可用,有什么替代方案吗?

A

利用termios库设置终端读取Esc键

在Linux环境中,可以通过termios库设置终端为非规范模式,从而实现对按键的实时读取。Esc键对应ASCII码27。示例步骤如下:

  1. 使用tcgetattr()获取当前终端设置。
  2. 修改终端属性,禁用规范模式和回显。
  3. 使用read()函数读取按键。
  4. 检测读取的字符是否为27来判断Esc键。

以下是示例代码片段:

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

int main() {
    struct termios oldt, newt;
    int ch;

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

    printf("请按下Esc键退出。\n");
    while(1) {
        ch = getchar();
        if(ch == 27) {
            printf("检测到Esc键,程序停止。\n");
            break;
        }
    }

    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
    return 0;
}
Q
为什么读取Esc键时程序会读取到多次输入?

我在写读取键盘的程序时,按下Esc键后程序好像多次检测到按键,出现重复读取,这是为什么?

A

Esc键可能与转义序列相关导致多次读取

一些终端或环境中,Esc键会发送多个字符组成的转义序列,而非单个字符27。例如上下方向键也是以Esc为起始字符的序列。这导致程序可能会在读取Esc后检测到后续字符。解决方法是检查输入的字符,如果确定只要单个27字符的Esc键,过滤掉后续字符或增加缓冲清理逻辑。若不需要处理复杂的转义序列,可以在读取到27后立即终止检测。