You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让C语言中的getch()函数忽略退格键与回车键字符

解决C语言密码输入中忽略退格与回车的问题

你的现有代码存在几个基础问题:

  • char password[5]="123456" 数组长度不足,字符串末尾需要'\0',会导致内存越界
  • 比较字符串不能直接用pass == password,这是比较数组地址,要用strcmp()函数
  • 没有实际读取用户输入的逻辑,也未用到getch()实现隐藏输入

下面是修正后的完整代码,实现隐藏输入、处理退格、忽略回车记录的功能:

#include <stdio.h>
#include <conio.h> // 提供getch(),GCC等编译器需用ncurses库替代
#include <string.h>
#include <stdlib.h>

int main() {
    char pass[100];
    const char *correct_password = "123456";
    int i = 0;
    char ch;

ps:
    printf("Enter password: ");
    memset(pass, 0, sizeof(pass));
    i = 0;

    while (1) {
        ch = getch(); // 读取按键,不回显真实字符

        // 处理回车键:结束输入流程
        if (ch == '\r' || ch == '\n') {
            printf("\n");
            break;
        }

        // 处理退格键:删除已输入的字符,不记录退格符
        if (ch == '\b' || ch == 127) { // 兼容不同系统的退格键编码
            if (i > 0) {
                i--;
                printf("\b \b"); // 控制台删除显示的*号
            }
            continue;
        }

        // 处理普通字符:记录并显示*
        if (i < sizeof(pass) - 1) { // 避免缓冲区溢出
            pass[i++] = ch;
            printf("*");
        }
    }

    // 验证密码
    if (strcmp(pass, correct_password) == 0) {
        printf("Access granted!\n");
    } else {
        printf("Access denied.\n");
        goto ps; // 重新输入
    }

    return 0;
}

关键逻辑说明

  • 隐藏输入:用getch()读取按键,不会在控制台回显真实字符,转而输出*
  • 忽略退格键:检测到退格键(\b或ASCII 127)时,仅调整缓冲区索引并删除控制台的*,不将退格符写入密码数组
  • 忽略回车键:检测到回车(\r或\n)时直接结束输入循环,不将回车符写入密码数组
  • 缓冲区安全:限制输入长度,避免数组越界
  • 密码验证:用strcmp()比较输入密码与正确密码,替代错误的地址比较

注意事项

  • getch()属于非标准库函数,GCC等编译器需安装ncurses库,改用该库中的getch()实现
  • 不同操作系统的退格键编码可能不同,代码同时处理两种常见编码确保兼容性

内容的提问来源于stack exchange,提问作者melodic_n

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 17:42:21