深山小草
2021-07-27 21:50
采纳率: 100%
浏览 35

C++制作的登录系统在判断用户名与密码时出错,以下是代码,应该怎样解决?

我正在用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;
}

  • 点赞
  • 收藏

2条回答 默认 最新

  • Soda Wang 2021-07-27 23:17
    已采纳

    “删除密码中的最后一个字符”时,应该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;
    }
    
    点赞 1 打赏 评论
  • 小爱-同学 2021-07-27 22:50
    
    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;
    }
    
    点赞 1 打赏 评论

相关推荐 更多相似问题