C语言getch函数的作用是什么?

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

getch() 是什么?

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

c语言getch 什么意思
(图片来源网络,侵删)

核心功能: 从标准输入(通常是键盘)读取一个字符,但这个字符不会在屏幕上显示出来(即不回显),程序会立即执行,不需要等待用户按下回车键。


主要特点和用途

getch() 的行为使其在一些特定场景下非常有用:

  1. 不回显

    • 当你按下键盘上的一个键('A'),屏幕上不会出现 'A',程序就已经读取到了这个字符。
    • 典型应用:输入密码,你输入密码时,屏幕上显示的是 或 ,而不是你实际输入的字符。getch() 可以用来获取原始输入,然后程序再决定显示什么(或不显示)。
  2. 立即响应

    c语言getch 什么意思
    (图片来源网络,侵删)
    • 程序会立刻执行,阻塞在 getch() 这一行,直到有任何一个键被按下。
    • 典型应用:游戏控制,在简单的控制台游戏中,你按下方向键或 'WASD',角色应该立即移动,而不是等你按完一串键再回车。getch() 可以实现这种即时响应。
  3. 无需按回车键

    • 相比 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

c语言getch 什么意思
(图片来源网络,侵删)

示例 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() 是一个方便但非标准的函数,主要用于需要即时、无回显输入的简单控制台程序,如果你在写跨平台的代码,应该避免使用它,或者像上面示例那样为不同平台提供不同的实现。

-- 展开阅读全文 --
头像
自学织梦仿站建站教程能快速上手吗?
« 上一篇 前天
c语言范例开发大全 pdf哪里能免费下载?
下一篇 » 前天

相关文章

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

目录[+]