C ++中的登录系统无法正常工作

时间:2016-12-23 12:30:32

标签: c++ turbo-c++

我正在尝试调试似乎不起作用的c ++登录系统(即使输入正确的用户ID和密码,它也说错了用户ID和密码)。
注册将登录详细信息存储在二进制文件中,同时登录读取该文件(ID.dat)并检查匹配 这是我的高中项目,我真的需要按时解决这个问题。我一直在尝试这么做很长一段时间。请指出可能的错误。谢谢你的帮助。

编辑:我添加了新功能,但它似乎无法正常工作

//Class for storing IDs
char Level;
class ID
{
    public:
    char username[20],pass1[20],pass2[20],IDtype,systemID[5];
    int checkuser(char u[20])
    {
        return(strncmp(u,username,strlen(u)));
    }
    int checkpass(char p[20])
    {
        return(strncmp(p,pass1,strlen(p)));
    }
};

//Registration function
void IDregister()
{
    clrscr();
    ID i;
    ofstream fout;  
    fout.open("ID.dat",ios::app);
    gotoxy(30,6);
    cout<<"*--- Register ---*";
    gotoxy(25,9);
    cout<<" Enter User ID - ";
    fgets(i.username,21,stdin);
    gotoxy(25,11);
    cout<<" Enter Password - ";
    fgets(i.pass1,21,stdin);
    do
    {
        cout<<"\n           Re-enter Password - ";
        fgets(i.pass2,21,stdin);
    }while(strncmp(i.pass1,i.pass2,strlen(i.pass1))!=0);
    cout<<"\n       To register as Admin, type system ID below.\n            Else press Enter ";
    fgets(i.systemID,6,stdin);
    if(strncmp(i.systemID,"#123#",5)==0)
        i.IDtype='A';
    else
        i.IDtype='U';
    fout.write((char*)&i,sizeof(i));
    cout<<i.IDtype;
    getch();
    fout.close();
    IDlogin();
}

//Log-in Function
void IDlogin()
{
    clrscr();
    int flag=1;
    ID acc;
    char usercheck[20],passcheck[20];
    ifstream fin;
    fin.open("ID.dat",ios::in);
    gotoxy(30,7);
    cout<<"*--- Log-in ---*";
    gotoxy(25,10);
    cout<<"Enter User ID - ";
    fgets(usercheck,21,stdin);
    gotoxy(25,12);
    cout<<"Enter Password - ";
    fgets(passcheck,21,stdin);
    gotoxy(25,14);
    while(!fin.eof())
    {
        fin.read((char*)&acc,sizeof(acc));
        if(acc.checkuser(usercheck)==0&&acc.checkpass(passcheck)==0)
            flag=0;
    }
    if(flag==0)
    {
        cout<<"Logged in successfully!";
        Level=acc.IDtype;
        getch();
        mainscreen();
    }
    else
    {
        cout<<"Wrong User ID or Password";
        getch();
        initscreen();
    }
}

1 个答案:

答案 0 :(得分:0)

尝试使用功能strcmp代替strncmp。这将确保您在最大n个字符进行比较,如果字符数组中有任何垃圾,则不会进行比较。 Documentation of strncmp

除此之外,使用gets是不安全的,请考虑改为使用fgets

 int checkuser(char u[20])
    {
        return(strncmp(u,username, strlen(username)));
    }
    int checkpass(char p[20])
    {
        return(strncmp(p,pass1, strlen(pass));
    }