如何用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
相关产品推荐
相关产品推荐

