c语言getche

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

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

c语言getche
(图片来源网络,侵删)

getche() 是什么?

getche() 是一个 C 语言函数,它的作用是从标准输入(通常是键盘)读取一个字符,并且立即显示(回显)这个字符到屏幕上。

这个名字本身就很形象:

  • get: 获取(Get)
  • ch: 字符
  • e: echo(回显)

它的声明位于头文件 <conio.h> 中。

// 函数原型
int getche(void);
  • 返回值:函数返回用户输入的字符的 ASCII 码值(一个 int 类型)。
  • 特点
    1. 无需回车:用户按下键后,函数立即返回,不需要等待用户按下回车键。
    2. 自动回显:用户按下的字符会自动显示在屏幕光标所在的位置。

如何使用 getche()

要使用 getche(),你需要在你的 C 程序中包含 <conio.h> 头文件。

c语言getche
(图片来源网络,侵删)

示例 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;
}

运行示例:

c语言getche
(图片来源网络,侵删)
程序正在执行第一步...
第一步完成,请按任意键继续... <-- 光标在这里等待
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 语言编译器上都能工作,是跨平台的。

重要注意事项

  1. 非标准库getche()getch() 不是 C 语言标准库的一部分,它们是 Borland C++ 为 MS-DOS 编译器引入的扩展函数,它们主要在 Windows 的命令提示符(cmd.exe)或某些嵌入式开发环境中可用,在 Linux 或 macOS 的标准终端中,这些函数不可用

  2. 跨平台替代方案:如果你需要编写跨平台的程序,并且希望实现类似 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 环境下进行快速的控制台程序开发和原型设计,但在需要考虑跨平台性的正式项目中,应避免使用它,并寻找替代方案。

-- 展开阅读全文 --
头像
dede搜索页面空白是什么原因?
« 上一篇 04-19
织梦v51默认密码是什么?
下一篇 » 04-19

相关文章

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

目录[+]