You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C语言在Linux终端读取单个字符输入?

实现无回车即时读取单个字符的函数

不同操作系统的终端输入机制不同,以下是针对Windows和Linux/Unix平台的实现方案:

Windows 平台

Windows 下可以直接使用微软扩展库 conio.h 中的 _getch() 函数,它会在按键按下时立即返回字符,且默认不回显输入内容:

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

// 即时读取单个字符,无回车要求
char get_single_char() {
    return _getch();
}

int main() {
    printf("按下任意键继续...\n");
    char input = get_single_char();
    printf("你按下的字符是: %c\n", input);
    return 0;
}

如果需要让输入的字符在控制台回显,可以替换为 _getche() 函数。

Linux/Unix 平台

Linux/Unix 终端默认处于规范模式(需按下回车才提交输入),需要通过 termios 库修改终端属性,切换为非规范模式实现即时读取:

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

char get_single_char() {
    struct termios old_attr, new_attr;
    char ch;

    // 保存当前终端属性
    tcgetattr(STDIN_FILENO, &old_attr);
    // 复制属性并修改为非规范模式
    new_attr = old_attr;
    new_attr.c_lflag &= ~(ICANON | ECHO);  // 关闭规范模式和回显
    new_attr.c_cc[VMIN] = 1;               // 至少读取1个字符
    new_attr.c_cc[VTIME] = 0;              // 无超时等待

    // 应用新的终端属性
    tcsetattr(STDIN_FILENO, TCSANOW, &new_attr);

    // 读取单个字符
    read(STDIN_FILENO, &ch, 1);

    // 恢复原终端属性,避免影响后续输入
    tcsetattr(STDIN_FILENO, TCSANOW, &old_attr);

    return ch;
}

int main() {
    printf("按下任意键继续...\n");
    char input = get_single_char();
    printf("你按下的字符是: %c\n", input);
    return 0;
}

若需要回显输入字符,只需移除 ECHO 的掩码(即删除 &= ~(ICANON | ECHO) 中的 ECHO)。

跨平台兼容实现

通过条件编译可以写出同时支持Windows和Linux/Unix的代码:

#include <stdio.h>

#ifdef _WIN32
#include <conio.h>
char get_single_char() {
    return _getch();
}
#else
#include <termios.h>
#include <unistd.h>
char get_single_char() {
    struct termios old_attr, new_attr;
    char ch;
    tcgetattr(STDIN_FILENO, &old_attr);
    new_attr = old_attr;
    new_attr.c_lflag &= ~(ICANON | ECHO);
    new_attr.c_cc[VMIN] = 1;
    new_attr.c_cc[VTIME] = 0;
    tcsetattr(STDIN_FILENO, TCSANOW, &new_attr);
    read(STDIN_FILENO, &ch, 1);
    tcsetattr(STDIN_FILENO, TCSANOW, &old_attr);
    return ch;
}
#endif

int main() {
    printf("按下任意键: ");
    char input = get_single_char();
    printf("\n你按下的字符是: %c\n", input);
    return 0;
}

内容的提问来源于stack exchange,提问作者hansoko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 06:48:21