getch() 是什么?
getch() 是一个“不回显”的字符输入函数,它的名字来源于 "get character"(获取字符)。

(图片来源网络,侵删)
核心功能: 从标准输入(通常是键盘)读取一个字符,但这个字符不会在屏幕上显示出来(即不回显),程序会立即执行,不需要等待用户按下回车键。
主要特点和用途
getch() 的行为使其在一些特定场景下非常有用:
-
不回显
- 当你按下键盘上的一个键('A'),屏幕上不会出现 'A',程序就已经读取到了这个字符。
- 典型应用:输入密码,你输入密码时,屏幕上显示的是 或 ,而不是你实际输入的字符。
getch()可以用来获取原始输入,然后程序再决定显示什么(或不显示)。
-
立即响应
(图片来源网络,侵删)- 程序会立刻执行,阻塞在
getch()这一行,直到有任何一个键被按下。 - 典型应用:游戏控制,在简单的控制台游戏中,你按下方向键或 'WASD',角色应该立即移动,而不是等你按完一串键再回车。
getch()可以实现这种即时响应。
- 程序会立刻执行,阻塞在
-
无需按回车键
- 相比
scanf("%c", &ch);或getchar(),用户按下单个字符后,程序就可以继续执行,省去了按回车键的步骤。
- 相比
重要提示:getch() 不是标准 C 函数
这是理解 getch() 最关键的一点!
- 标准 C 库(如 C89/C90, C99, C11)中没有
getch()这个函数。 getch()是由一些特定的 C 编译器提供的非标准扩展,主要用于DOS/Windows 环境。
最常见的来源是:
- Turbo C/C++:一个非常古老的、主要用于教学和DOS环境的编译器。
- Borland C++:同样是 Borland 公司的产品,与 Turbo C 关系密切。
- Windows 下的某些编译器(如 MinGW 配合 conio.h):为了兼容旧的代码或简化某些控制台操作,它们也提供了
conio.h头文件,其中包含getch()。
如何使用(代码示例)
要使用 getch(),你需要包含头文件 conio.h。

(图片来源网络,侵删)
示例 1:简单的按键响应
#include <stdio.h>
#include <conio.h> // 必须包含这个头文件
int main() {
printf("请按任意一个键继续...\n");
// 程序会在这里等待,直到你按下任意一个键
char key = getch(); // 读取一个键,但不在屏幕上显示
printf("\n你按下的键是: %c\n", key); // 现在才显示你按了什么
return 0;
}
示例 2:模拟密码输入
#include <stdio.h>
#include <conio.h>
int main() {
char password[20];
int i = 0;
printf("请输入密码: ");
// 循环读取,直到按下回车键
while (1) {
char ch = getch(); // 获取一个字符,不回显
// 如果按下的是回车键,则结束输入
if (ch == '\r') {
password[i] = '\0'; // 字符串结束符
break;
}
// 如果按下的是退格键,则删除一个字符
else if (ch == '\b' && i > 0) {
i--;
printf("\b \b"); // 光标回退一格,打印一个空格,再回退一格
}
// 如果是普通字符,则显示星号并存储
else if (ch >= 32 && ch <= 126) { // 可打印字符范围
password[i++] = ch;
printf("*");
}
}
printf("\n\n你输入的密码是: %s\n", password);
return 0;
}
在 Linux/macOS 上的替代方案
因为 getch() 是 Windows/DOS 特有的,如果你在 Linux 或 macOS 上使用 GCC 或 Clang 编译器,直接包含 conio.h 会报错。
在 Unix-like 系统中,你可以使用 <termios.h> 和 <unistd.h> 来实现类似的功能,这需要更底层的操作,主要是修改终端的属性。
Linux/macOS 上的 getch() 替代函数示例:
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
// 设置终端为“不回显、立即读取”模式
void set_terminal_mode() {
struct termios old_t, new_t;
tcgetattr(STDIN_FILENO, &old_t); // 获取当前终端属性
new_t = old_t;
new_t.c_lflag &= ~(ICANON | ECHO); // 关闭规范模式 和 回显
tcsetattr(STDIN_FILENO, TCSANOW, &new_t); // 立即应用新属性
}
// 恢复终端原始模式
void restore_terminal_mode(struct termios old_t) {
tcsetattr(STDIN_FILENO, TCSANOW, &old_t);
}
// 自定义的 getch() 函数
char my_getch() {
char ch;
read(STDIN_FILENO, &ch, 1);
return ch;
}
int main() {
struct termios old_termios;
tcgetattr(STDIN_FILENO, &old_termios);
set_terminal_mode();
printf("请按任意一个键继续...\n");
char key = my_getch();
printf("\n你按下的键是: %c (ASCII码: %d)\n", key, key);
restore_terminal_mode(old_termios); // 恢复终端,否则后续输入会很奇怪
return 0;
}
| 特性 | getch() |
getchar() / scanf("%c", ...) |
|---|---|---|
| 来源 | 非标准,来自 conio.h (DOS/Windows) |
标准 C,来自 stdio.h |
| 回显 | 不回显 | 会回显 |
| 触发 | 按下任意键立即触发 | 按下回车键后才触发 |
| 平台 | 主要在 Windows/DOS | 所有平台 |
| 用途 | 密码输入、游戏控制、暂停程序 | 通用文本输入 |
getch() 是一个方便但非标准的函数,主要用于需要即时、无回显输入的简单控制台程序,如果你在写跨平台的代码,应该避免使用它,或者像上面示例那样为不同平台提供不同的实现。
