getch() 函数最常见的头文件是 conio.h。

(图片来源网络,侵删)
重要提示:
conio.h 是一个非标准的头文件,它不属于 C 语言的标准库(由 ISO C/ANSI C 定义),这意味着:
- 它不是在所有 C 编译器中都可用。
- 它主要在 Windows 平台下的某些特定编译器(如 Turbo C、Borland C++、Visual C++ 6.0 及更早版本、MinGW 等)中提供。
- 在 Linux、macOS 等操作系统或现代的、遵循标准的编译器(如 GCC、Clang)中,没有
conio.h。
getch() 的作用和特点
getch() 的全称是 "get character"(获取字符),它的主要特点是:
- 立即获取输入:当用户按下键盘上的一个键时,
getch()会立即返回该字符,不需要等待用户按下回车键。 - 不回显:用户输入的字符不会显示在屏幕上,这对于需要隐藏输入的场景(如输入密码)非常有用。
- 常用于程序暂停:在程序的关键位置调用
getch(),可以暂停程序的执行,等待用户按下任意键后继续。
使用示例 (Windows 环境)
下面是一个在 Windows 环境下使用 getch() 的简单示例。
#include <stdio.h>
#include <conio.h> // 必须包含这个头文件
int main() {
char ch;
printf("请按任意键继续...\n");
ch = getch(); // 程序会在这里暂停,等待用户按键
printf("\n你按下的键是: ");
// 如果按下的键是可打印字符,直接显示
// 如果是功能键(如方向键、F1等),getch()会返回两个值,第一个是0或0xE0,第二个是具体码
if (ch == 0 || ch == 0xE0) {
printf("这是一个功能键。");
} else {
putchar(ch); // 显示按下的字符
}
printf("\n程序结束,\n");
return 0;
}
在不同平台上的替代方案
由于 conio.h 的非标准性,我们需要了解在不同环境下如何实现类似的功能。

(图片来源网络,侵删)
在 Windows 环境下的标准替代方案 (不使用 conio.h)
如果你想在 Windows 上使用标准 C 库来实现类似功能,可以使用 <windows.h> 和 <conio.h> 中的 _getch()(带下划线版本,表示非标准扩展)。
#include <stdio.h>
#include <windows.h> // 用于设置控制台模式
// 使用标准C库在Windows下实现getch()功能
int my_getch() {
DWORD mode, count;
HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
// 获取当前控制台模式
GetConsoleMode(hStdIn, &mode);
// 取消“回显”和“等待回车”的标志
SetConsoleMode(hStdIn, mode & ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT));
// 读取一个字符
count = 0;
ReadConsole(hStdIn, &ch, 1, &count, NULL);
// 恢复控制台模式
SetConsoleMode(hStdIn, mode);
return ch;
}
int main() {
char ch;
printf("请按任意键继续 (标准库实现)...\n");
ch = my_getch();
printf("\n你按下的键是: %c\n", ch);
return 0;
}
这个方法更复杂,但依赖于 Windows API,不具备跨平台性。
在 Linux / macOS 环境下的替代方案
在类 Unix 系统中,没有 getch(),最常用的替代方法是使用 <termios.h> 和 <unistd.h> 来修改终端的输入模式,实现不回显、立即读取的效果。
#include <stdio.h>
#include <termios.h>
#include <unistd.h> // 用于 read() 函数
// 在Linux/macOS下实现getch()功能
int my_getch() {
struct termios oldt, newt;
char ch;
// 获取当前的终端属性
tcgetattr(STDIN_FILENO, &oldt);
// 复制一份新的属性
newt = oldt;
// 禁用规范模式(canonical mode)和回显(echo)
newt.c_lflag &= ~(ICANON | ECHO);
// 设置新的终端属性
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
// 从标准输入读取一个字符
ch = getchar();
// 恢复终端的原始属性
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
return ch;
}
int main() {
char ch;
printf("请按任意键继续 (Linux/macOS实现)...\n");
ch = my_getch();
printf("\n你按下的键是: %c\n", ch);
return 0;
}
| 特性 | getch() (Windows) |
my_getch() (Linux/macOS) |
|---|---|---|
| 头文件 | #include <conio.h> |
#include <termios.h> #include <unistd.h> |
| 平台 | Windows (非标准) | Linux, macOS (标准库) |
| 优点 | 简单易用,一行代码搞定 | 跨平台,遵循标准 |
| 缺点 | 非标准,不可移植 | 代码相对复杂,需要理解终端I/O |
最佳实践建议:
- 如果你只是在 Windows 上快速开发或学习,并且使用的是支持
conio.h的旧编译器,直接使用#include <conio.h>和getch()是最方便的。 - 如果你追求代码的可移植性和标准化,你应该避免使用
conio.h,可以自己封装一个跨平台的getch()函数,在编译时根据操作系统选择不同的实现。 - 在现代 C++ 开发中,通常会使用更高级的库(如 ncurses 用于控制台应用,或 Qt、SFML 等用于图形界面应用)来处理用户输入,这些库提供了更强大和跨平台的解决方案。
