这是一个在控制台程序中非常实用的函数,尤其是在学习和调试阶段。

(图片来源网络,侵删)
getche() 是什么?
getche() 是一个 C 语言函数,它的作用是从标准输入(通常是键盘)读取一个字符,并且立即显示(回显)这个字符到屏幕上。
这个名字本身就很形象:
- get: 获取(Get)
- ch: 字符
- e: echo(回显)
它的声明位于头文件 <conio.h> 中。
// 函数原型 int getche(void);
- 返回值:函数返回用户输入的字符的 ASCII 码值(一个
int类型)。 - 特点:
- 无需回车:用户按下键后,函数立即返回,不需要等待用户按下回车键。
- 自动回显:用户按下的字符会自动显示在屏幕光标所在的位置。
如何使用 getche()?
要使用 getche(),你需要在你的 C 程序中包含 <conio.h> 头文件。

(图片来源网络,侵删)
示例 1:最基本的用法
这个例子会等待你按下一个键,然后将你按下的字符和它的 ASCII 码打印出来。
#include <stdio.h>
#include <conio.h> // 必须包含这个头文件
int main() {
char ch;
int ascii_value;
printf("请按任意一个键(按 ESC 退出)...\n");
// getche() 会等待用户输入一个字符
// 并将输入的字符赋值给 ch
ch = getche();
// getche() 的返回值就是字符的 ASCII 码
ascii_value = ch; // 或者直接 ascii_value = getche();
printf("\n你按下的字符是: %c\n", ch);
printf("它的 ASCII 码是: %d\n", ascii_value);
return 0;
}
运行示例:
请按任意一个键(按 ESC 退出)...
A <-- 你输入了 'A',它立即显示在屏幕上
你按下的字符是: A
它的 ASCII 码是: 65
示例 2:实现一个简单的“按任意键继续”
getche() 非常适合用于暂停程序,并提示用户按任意键继续。
#include <stdio.h>
#include <conio.h>
int main() {
printf("程序正在执行第一步...\n");
printf("第一步完成。");
// 提示用户并暂停
printf("\n\n请按任意键继续...");
getche(); // 程序会在这里等待,直到用户按下任意键
printf("\n程序正在执行第二步...\n");
printf("第二步完成,程序结束,\n");
return 0;
}
运行示例:

(图片来源网络,侵删)
程序正在执行第一步...
第一步完成,请按任意键继续... <-- 光标在这里等待
X <-- 你输入了 'X'
程序正在执行第二步...
第二步完成,程序结束。
getche() 与相关函数的比较
getche() 并不是唯一的输入函数,理解它与其它函数的区别非常重要。
| 函数 | 头文件 | 是否回显 | 是否需要回车 | 用途 |
|---|---|---|---|---|
getche() |
<conio.h> |
是 | 否 | 获取一个字符并立即显示,无需回车。 |
getch() |
<conio.h> |
否 | 否 | 获取一个字符,不显示在屏幕上,无需回车,常用于密码输入。 |
getchar() |
<stdio.h> |
是 | 是 | 从缓冲区获取一个字符,需要回车确认,标准库函数,跨平台。 |
scanf(" %c", &ch) |
<stdio.h> |
是 | 是 | 功能同 getchar(),但格式更复杂,容易受前面输入的影响。 |
getche() vs getch()
这是最常见的一组对比。
getche(): 有回显,你输入什么,屏幕上就显示什么,适用于需要用户确认输入的场景。getch(): 无回显,你输入字符,但屏幕上看不到它。非常适合输入密码。
示例:使用 getch() 实现密码输入
#include <stdio.h>
#include <conio.h>
int main() {
char password[20];
int i = 0;
printf("请输入密码: ");
// 循环读取,直到用户按下回车键
while ((password[i] = getch()) != '\r') { // \r 是回车符
// 如果用户按的是退格键,则删除一个字符
if (password[i] == '\b' && i > 0) {
i--;
printf("\b \b"); // 光标回退一格,打印一个空格,再回退一格
}
// 如果输入的不是退格键,则显示一个星号
else if (password[i] != '\b') {
printf("*");
i++;
}
}
password[i] = '\0'; // 字符串结束符
printf("\n密码输入完成,\n");
return 0;
}
运行示例:
请输入密码: **** <-- 你输入 "1234",但显示为星号
密码输入完成。
getche() vs getchar()
getche(): 非阻塞式(对于输入而言),直接响应键盘事件,属于非标准库函数(<conio.h>),主要在 Windows 的 DOS/命令行环境下工作。getchar(): 阻塞式,等待用户输入一行文本(直到回车),然后从输入缓冲区中读取一个字符,属于 C 标准库函数(<stdio.h>),在任何 C 语言编译器上都能工作,是跨平台的。
重要注意事项
-
非标准库:
getche()和getch()不是 C 语言标准库的一部分,它们是 Borland C++ 为 MS-DOS 编译器引入的扩展函数,它们主要在 Windows 的命令提示符(cmd.exe)或某些嵌入式开发环境中可用,在 Linux 或 macOS 的标准终端中,这些函数不可用。 -
跨平台替代方案:如果你需要编写跨平台的程序,并且希望实现类似
getche()的功能(即按任意键继续),可以使用以下方法:#include <stdio.h> #include <termios.h> #include <unistd.h> // 用于 Linux/macOS void my_getch() { struct termios oldt, newt; char ch; tcgetattr(STDIN_FILENO, &oldt); newt = oldt; newt.c_lflag &= ~(ICANON | ECHO); tcsetattr(STDIN_FILENO, TCSANOW, &newt); ch = getchar(); tcsetattr(STDIN_FILENO, TCSANOW, &oldt); } int main() { printf("按任意键继续..."); my_getch(); printf("\n你按下了键,\n"); return 0; }这个代码通过修改终端的属性来禁用缓冲(
ICANON)和回显(ECHO),从而实现了类似getch()的功能,并且是跨平台的。
| 特性 | 描述 |
|---|---|
| 功能 | 从键盘获取一个字符并立即回显。 |
| 优点 | 简单易用,交互性好,无需回车。 |
| 缺点 | 非标准库,不具备跨平台性。 |
| 适用场景 | Windows 控制台程序、游戏、菜单选择、调试、简单的交互式应用。 |
| 核心区别 | 与 getch() 的区别在于是否回显;与 getchar() 的区别在于是否需要回车和平台依赖性。 |
getche() 是一个非常方便的工具,特别适合于在 Windows 环境下进行快速的控制台程序开发和原型设计,但在需要考虑跨平台性的正式项目中,应避免使用它,并寻找替代方案。
