getch函数在C语言中属于哪个头文件?

99ANYc3cd6
预计阅读时长 13 分钟
位置: 首页 C语言 正文

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

c语言 getch 头文件
(图片来源网络,侵删)

重要提示: 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"(获取字符),它的主要特点是:

  1. 立即获取输入:当用户按下键盘上的一个键时,getch() 会立即返回该字符,不需要等待用户按下回车键
  2. 不回显:用户输入的字符不会显示在屏幕上,这对于需要隐藏输入的场景(如输入密码)非常有用。
  3. 常用于程序暂停:在程序的关键位置调用 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 的非标准性,我们需要了解在不同环境下如何实现类似的功能。

c语言 getch 头文件
(图片来源网络,侵删)

在 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

最佳实践建议:

  1. 如果你只是在 Windows 上快速开发或学习,并且使用的是支持 conio.h 的旧编译器,直接使用 #include <conio.h>getch() 是最方便的。
  2. 如果你追求代码的可移植性和标准化,你应该避免使用 conio.h,可以自己封装一个跨平台的 getch() 函数,在编译时根据操作系统选择不同的实现。
  3. 在现代 C++ 开发中,通常会使用更高级的库(如 ncurses 用于控制台应用,或 Qt、SFML 等用于图形界面应用)来处理用户输入,这些库提供了更强大和跨平台的解决方案。
-- 展开阅读全文 --
头像
雷霆军事网dede整站
« 上一篇 03-06
C语言socket编程视频从哪开始学?
下一篇 » 03-06

相关文章

取消
微信二维码
支付宝二维码

目录[+]