C++制作的登录系统在判断用户名与密码时出错,以下是代码,应该怎样解决?
其他问答
1
我正在用C++制作一个登录系统,但是我输入正确用户名和密码的时候程序却提示我登录失败(我在输入密码的时候因为写错有回退重新输入过,在我一次性输入正确的用户名、密码时得到的结果却是登录成功),我怀疑是在程序处理回退键是出现了问题,把密码的值更改了,这部分代码大概在29-47行之间,没有报错,但是结果不正确,希望专家能帮我解决这个问题,Thank you!我的操作系统是Windows10专业版,版本20H2,开发工具为Visual Studio 2022预览版。 这是代码
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <conio.h>
using namespace std;
string RemoveEscapeChar(string text);
//定义转义字符数组
char scapeChar[] = {'\b', '\r'};
int main()
{
//正确的用户名和密码
string rightUserName = "admin";
string rightPassword = "123456";
//可用登录次数
int totalLoginTimes = 3;
while (true)
{
//声明需要的变量
string userName, singlePassword, fullPassword;
char readSingleChar;
printf("请输入用户名\n");
//接收输入并赋值给userName
cin >> userName;
printf("请输入密码\n");
//用户输入的字符不是回车则进入循环
while ((readSingleChar = _getch()) != 13)
{
//把接收到的字符拼接到密码上
fullPassword += readSingleChar;
//如果接收到的字符为回退
if (readSingleChar == 8)
{
//回撤一格,用空格遮住星号,再回撤一格等待录入
printf("\b \b");
//删除密码中的最后一个字符
fullPassword.pop_back();
}
//否则
else
{
//打印星号
cout << "*";
}
}
//调用函数移除转义字符
fullPassword = RemoveEscapeChar(fullPassword);
//如果用户输入的用户名与密码正确
if ((userName == rightUserName) && (fullPassword == rightPassword))
{
//输出提示
printf("\n登录成功!\n");
}
else
{
//输出错误提示
printf("用户名和密码错误,您还有%d次机会!\n", totalLoginTimes);
//次数减一
totalLoginTimes--;
}
}
}
string RemoveEscapeChar(string text)
{
//移除文本中的转义字符
for (int index = 0; index < 2; index++)
{
text.erase(remove(text.begin(), text.end(), scapeChar[index]), text.end());
}
return text;
}
-
“删除密码中的最后一个字符”时,应该
pop_back
两次,第一次去除\b
,然后再去除要删除的字符;这样也不需要RemoveEscapeChar
了。#include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <conio.h> using std::cin; using std::cout; using std::endl; using std::string; int main() { system("chcp 65001"); //正确的用户名和密码 string rightUserName = "admin"; string rightPassword = "123456"; //可用登录次数 int totalLoginTimes = 3; while (true) { //声明需要的变量 string userName, singlePassword, fullPassword; char readSingleChar; printf("请输入用户名\n"); //接收输入并赋值给userName cin >> userName; printf("请输入密码\n"); //用户输入的字符不是回车则进入循环 while ((readSingleChar = _getch()) != 13) { //把接收到的字符拼接到密码上 fullPassword += readSingleChar; //如果接收到的字符为回退 if (readSingleChar == 8) { //回撤一格,用空格遮住星号,再回撤一格等待录入 printf("\b \b"); //删除密码中的最后一个字符 fullPassword.pop_back(); fullPassword.pop_back(); } //否则 else { //打印星号 cout << "*"; } } int a = 1; //用于调试 //如果用户输入的用户名与密码正确 if ((userName == rightUserName) && (fullPassword == rightPassword)) { //输出提示 printf("\n登录成功!\n"); break; } else { //输出错误提示 printf("\n用户名或密码错误,您还有%d次机会!\n", totalLoginTimes); //次数减一 totalLoginTimes--; if (totalLoginTimes == -1) { break; } } } return 0; }
-
bool Signin(char username[]) //管理员用户登录,用于验证密码,三次机会 { int times = 1; char ch; char pass[20]; while (times <= 3) { int i = 0; system("cls"); cout<<"用户名:admin\n请输入用户密码:"; while ((ch = getch()) != '\r') { if (ch == '\b' && i > 0) { cout << '\b\b'; i--; } else { cout << '*'; pass[i++] = ch; } } cout << endl; pass[i] = '\0'; if ((strcmp(username,"admin")) != 0 || (strcmp(pass,"123456")) != 0 ) { if (times == 3) { cout << "用户名密码错误,自动退出" << endl; system("pause"); return false; } else { cout << "用户名密码错误,还有" << (3 - times) << "次机会" << endl; system("pause"); } } else { cout << "密码正确;" << endl; return true; } times++; } return false; }
发表回复