我正在用C ++创建一个登录菜单
我希望在程序终止之前让用户尝试输入密码。
如果用户第一次获得正确的密码,我的代码运行正常。然后它将进入主菜单等。但是,如果用户输入密码错误。终端可以运行:
Login: Fred
Password: ***
Wrong password
Please re-enter password:
在此之后,无论用户输入什么,都不会显示任何内容。甚至ctrl-C都不能退出程序。我想知道是否有人知道发生了什么,并且可以指出我正确的方向。
以下是名为“HomePage”的类中“login”方法的部分代码:
cout<<"Password: ";
while (loginAttempt < 3){ //The user gets to attempt to type
//the password 3 times
password = receivePassword(); //Receives password from user
if (flatMemberList[match].getPassword()==password){ //Check if the password is correct
cout<<endl<<"Welcome back "<<loginName<< endl; //If correct, display welcome message
return;
}
else{
loginAttempt++; //Record down one failed attempt
cout<<endl<<"Wrong password"<<endl; //If incorrect, display error
cout<<"Please re-enter password: ";
}
}
cout<<"you have exceeded the legal login attempts"<<endl;
exit(1);
其中receivePassword()是一种自定义方法,如下所示:
//This method is called when the user types in a password
//The terminal's setting is first changed to 'raw' configuration
//The password are taken in one letter at a time
//It outputs to terminal "*" instead of echoing the input
string HomePage::receivePassword(){
termios oldt, newt; //The structs for manipulation
char password[PaswordLength]; //Password held here
int j = 0; //Password index
tcgetattr(STDIN_FILENO, &oldt); //Get configuration details
newt = oldt;
cfmakeraw(&newt); //Set up new 'raw' configuration structure
//Set up new terminal configuration
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
cin.ignore(1000, '\n'); //flush all the buffers
while(true){
password[j] = cin.get();
if( password[j] == '\r' ) { //check if 'enter' key is entered
password[j] = '\0'; //replace cr with null to make C string
break;
}
cout.put('*'); //echo the asterisk
j++;
} ;
//Reset terminal to old configuration
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
return password;
}
提前致谢
如果您认为问题可能在其他地方,请告诉我,我会发布代码。
答案 0 :(得分:0)
我不知道你的具体问题是什么。但是,您可以应用标准调试技术来找出导致问题的部分。
首先,您正在使用终端(cfmakeraw
,tcsetattr
等)进行奇怪的事情。听起来这可能与问题有关。因此,删除隐藏用户输入的代码,并确保在密码正常回显到屏幕时您的程序正常工作。你应该能够轻松地做到这一点。
完成此操作后,您可以决定您的问题是否与以下内容相关:
这通常被称为“分而治之”的调试技术。如果您删除了认为的代码,那么问题是否仍然存在可以帮助您确定它是否与您删除的代码相关。
答案 1 :(得分:0)
在我新生一年级的最后一个项目中,我只是在为最终项目使用类似的代码集。事实证明,问题出在密码屏蔽本身。 现在,我已经删除了那些零件,该程序现在可以正常工作了,而不是裸露的针脚。