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
相关产品推荐
相关产品推荐

