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

C语言登录模块重输后校验失败及密码掩码逻辑优化咨询

C语言POS系统登录模块问题修复

问题根因说明

1. 二次输入校验失效

密码读取的下标变量i定义在登录循环外层,第一次输入密码后i会累加到对应密码长度+1的位置,二次输入时下标没有重置为0,新输入的密码会写入密码数组的后续位置,数组前半段残留第一次输入的错误内容,导致字符串比对失败。
另外原代码未引入<stdlib.h>头文件,调用system("CLS")存在编译兼容问题。

2. 密码掩码逻辑缺陷

现有掩码逻辑未对按键做过滤:

  • 回车键\r会被先写入密码数组,直到循环结束才替换为字符串结束符
  • 退格键(ASCII值为8)会被直接计入密码串,同时额外打印星号,既无法删除已输入内容,还会导致密码串包含无效控制字符

修复方案

  • 将密码下标变量i的初始化移动到每次密码输入流程的开头,每次读取密码前重置下标为0,避免历史输入残留
  • 增加按键判断逻辑:
    • 读到回车键时直接终止输入,补字符串结束符,不将回车存入有效密码串
    • 读到退格键时,若当前已输入有效字符则回退下标,同时擦除屏幕上最后一个星号,不将退格存入密码串
    • 普通可见字符才存入密码数组、打印星号
  • 补充缺失的头文件引用
  • 增加输入边界校验,避免数组越界

修复后完整代码

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h> // 补充system函数需要的头文件

void login();
void mainmenu();

int main ()
{
    login();
    mainmenu();
    return 0;
}

void login()
{
    char username[100], password[100];
    int logincheck = 0;
    const char* valid_user = "username";
    const char* valid_pwd = "password";

    printf("Welcome to The POS!");
    
    while(logincheck != 1)
    {
        printf("\nPlease enter your username: ");
        scanf("%s", username);
        // 清空标准输入缓冲区残留,避免后续读入异常
        while(getchar() != '\n');
    
        printf("\nPassword: ");
        int i = 0; // 每次输密码前重置下标
        char ch;
        while(1)
        {
            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) // 只接收可见ASCII字符
            {
                password[i] = ch;
                printf("*");
                i++;
                // 增加密码长度上限判断,避免数组越界
                if (i >= 99)
                {
                    password[i] = '\0';
                    break;
                }
            }
        }
        
        if(strcmp(username, valid_user) == 0 && strcmp(password, valid_pwd) == 0)
        {
            printf("\nWelcome to the POS!");
            logincheck = 1;
        }
        else
        {
            printf("\nIncorrect Username or Password!");
            system("pause");
            system("CLS");
        }
    }
}

void mainmenu()
{
    printf("\n*Placeholder*");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:21:18