我正在尝试调试似乎不起作用的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();
}
}
答案 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));
}