如何在密码掩码中处理退格键与回车键,并限制仅接受字母和数字输入
解决密码输入掩码、退格/回车处理及输入过滤问题
将我希望在用户输入密码时用"*"进行掩码显示。我使用了getch()函数,但该函数会将退格键和回车键也当作字符接收。以下是我编写的代码:
#include <iostream> #include <conio.h> using namespace std; int main() { char password[7]; char PASSWORD[7]="abc123"; pass: cout<<"Enter the 6 character password: "<<endl; for(int i=0;i<6;i++) { password[i]=getch(); cout<<"*"; //To mask the user input with '*' } cout<<endl; if(strcmp(password,PASSWORD)==0) { cout<<"LOGIN SUCCESSFULL..."<<endl<<flush; system ("PAUSE"); } else{ cout<<"Incorrect Password;"<<endl; goto pass; //goes back to "pass:" and asks for password input again. } return 0; }请问如何修改代码,使其能够正确处理退格键与回车键,并且仅接受字母和数字作为输入?
问题分析与修改方案
你的代码基础框架没问题,但有几个关键细节需要调整才能满足需求:
- 缺少
<cstring>头文件,strcmp函数依赖它才能正常编译 - 未处理退格键,导致按退格后输入计数仍会增加,密码数组会混入无效字符
- 没有过滤非字母数字的非法输入
- 密码数组未添加字符串终止符
'\0',strcmp比较时可能出现未定义行为 - 未处理用户提前按回车的情况
下面是修改后的完整代码,我会逐点说明改动逻辑:
#include <iostream> #include <conio.h> #include <cstring> // 新增:用于strcmp字符串比较函数 using namespace std; int main() { char password[7]; const char PASSWORD[7] = "abc123"; // 改为const,明确这是不可修改的常量 pass: cout << "Enter the 6 character password (only letters and numbers): " << endl; int i = 0; // 把索引变量提到循环外,方便灵活调整输入位置 while (i < 6) { char ch = getch(); // 处理退格键(ASCII码为8,对应'\b') if (ch == '\b' && i > 0) { i--; // 在控制台删除之前输出的*:退格+空格+退格,实现视觉上的删除效果 cout << "\b \b"; continue; } // 处理回车键(ASCII码为13,对应'\r') if (ch == '\r') { if (i == 6) { break; // 输入满6位时,回车直接确认 } else { cout << "\nPlease enter all 6 characters first!" << endl; continue; // 未输满时提示继续输入 } } // 过滤输入:只接受大小写字母和数字 if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9')) { password[i] = ch; cout << "*"; i++; } // 非法输入直接忽略,不输出*也不增加计数 } password[6] = '\0'; // 必须添加字符串终止符,确保strcmp能正确比较两个字符串 cout << endl; if (strcmp(password, PASSWORD) == 0) { cout << "LOGIN SUCCESSFULL..." << endl; system("PAUSE"); } else { cout << "Incorrect Password;" << endl; goto pass; } return 0; }
关键改动说明:
- 头文件补充:添加
<cstring>解决strcmp的编译依赖问题 - 循环重构:将for循环改为while循环,方便灵活控制输入索引
i,适配退格和回车的处理逻辑 - 退格处理:检测到退格键时,索引回退一位,同时通过控制台输出序列删除对应的
*,让界面显示和实际输入状态一致 - 回车处理:根据输入长度判断是否允许回车确认,避免用户提前终止输入导致密码长度不足
- 输入过滤:通过字符范围判断,仅接受合法的字母数字输入,非法输入直接忽略
- 字符串终止符:在密码数组末尾添加
'\0',确保strcmp可以正确进行字符串比较 - 常量规范:将目标密码
PASSWORD改为const char类型,符合常量不可修改的编程规范
这样修改后,密码输入功能就完全符合你的需求了,用户可以正常用退格修改输入,只能输入合法字符,回车也能按预期处理。
内容的提问来源于stack exchange,提问作者samuelkaris
相关产品推荐
相关产品推荐

