我正在用C++制作一个登录系统,在输入密码时我使用了_getch()获取用户输入的单个字符,这有一个问题,那就是它也会接收方向键等按键,密码一般不包含这些,我尝试判断用户按下的键是否是字母或数字,如果是才输出星号,但是运行起来,按方向键依旧会显示星号,这部分代码大概在50-54行之间,没有报错,但是结果不正确,希望哪位专家能帮我解决这个问题!我的操作系统是Windows10专业版,版本20H2,开发工具为Visual Studio 2022预览版。
这是代码
#include <stdio.h>
#include <iostream>
#include <string>
#include <conio.h>
#include <fstream>
#include <sstream>
#include <Windows.h>
using namespace std;
string RemoveEscapeChar(string text);
//定义转义字符数组
char scapeChar[] = {'\b', '\r'};
int main()
{
//正确的用户名和密码
string rightUserName = "admin";
string rightPassword = "123456";
//登录次数
int loginTimes = 0;
while (true)
{
//声明需要的变量
string userName, fullPassword;
char readSingleChar;
printf("请输入用户名\n");
//接收输入
cin >> userName;
printf("请输入密码\n");
//用户输入的字符不是回车符则进入循环
while ((readSingleChar = _getch()) != 13)
{
//把接收到的字符拼接到密码上
fullPassword += readSingleChar;
//如果接收到的字符为回退符
if (readSingleChar == 8)
{
//回撤一格,用空格遮住星号,再回撤一格等待录入
printf("\b \b");
//密码长度最小要是2,因为在按回退键的时候,除了密码以外结尾会加一个\b,而且后面需要删除两个字符
if (fullPassword.length() > 1)
{
//pop_back两次, 第一次去除\b, 第二次去除要删除的字符
fullPassword.pop_back();
fullPassword.pop_back();
}
}
//否则
else if ((readSingleChar >= 'a' && readSingleChar <= 'z') || (readSingleChar >= 'A' && readSingleChar <= 'Z') || (readSingleChar >= '0' && readSingleChar <= '9'))
{
//打印星号
cout << "*";
}
}
//调用函数移除转义字符
fullPassword = RemoveEscapeChar(fullPassword);
//判断是否已被锁定
if (loginTimes >= 3)
{
printf("\n目前登录已被锁定,请稍后再试!\n");
//睡眠10秒
Sleep(10000);
//登录次数清零
loginTimes = 0;
printf("已解除锁定\n");
}
else
{
//如果用户输入的用户名与密码正确
if ((userName == rightUserName) && (fullPassword == rightPassword))
{
//输出提示
printf("\n登录成功!\n");
break;
}
else
{
//输出错误提示
printf("\n用户名或密码错误,您还有%d次机会!\n", 3 - loginTimes);
//登录次数增加
loginTimes++;
}
}
}
return 0;
}
string RemoveEscapeChar(string text)
{
//移除文本中的转义字符
for (int index = 0; index < 2; index++)
{
text.erase(remove(text.begin(), text.end(), scapeChar[index]), text.end());
}
return text;
}