当我运行我的程序时,用户可以登录,但是如果输入错误的用户名,它会再次运行检查用户名循环,说他们没有输入有效的用户名。除了一件事,这项工作完全没问题。假设他们尝试三次登录,第三次尝试是正确的,并提示输入密码。一旦他们输入它,它会要求第二个密码,然后是第三个密码。似乎它正在完成其他尝试的功能。我想不出办法检查这个。有任何想法吗。
如果您看一下,就可以看到我在UserCheck
内呼叫getNameIndex
。我几乎肯定这是发生错误的地方。
检查用户的功能:
void User_Psw::UserCheck()
{
// read from the database
ifstream fin("dataBase.txt", ios::in);
if( !fin.good() )
{
cout << "Failed to open database file." << endl;
return;
}
while (fin >> username >> password)
{
Usernames.push_back(username);
Password.push_back(password);
++sizeOfDatabase; // This may or may not be needed elsewhere.
}
// rest of the program
cout << "Username: ";
cin >> username;
getNameIndex();
cout << "Password: ";
cin >> password;
if(!PasswordMatches())
{
cout << "Access denied";
}
else
{
cout << "Success! You have logged in.";
}
}
这是用户名检查功能
void User_Psw::getNameIndex()
{
userThere = false;
for(int i=0; i < sizeOfDatabase; i++)
{
if (Usernames[i] == username)
{
index = i;
userThere = true;
}
}
if (userThere == false)
{
cout << "\nThat user name does not exsist. \n";
cout << "Please try again. \n\n";
UserCheck();
}
}
答案 0 :(得分:1)
你的程序结构错了。
而不是getNameIndex再次调用UserCheck(),你应该让getNameIndex返回一个bool - 成功时为true,失败时为false。在循环中运行它,如下所示:
bool success = false;
while (!success)
{
cout << "Username: ";
cin >> username;
success = getNameIndex();
}
此外,您应该将它们传递给函数,而不是使用全局变量。类似的东西:
success = getNameIndex(username);
和getNameIndex()
不应该执行任何I / O - 调用getNameIndex()
的函数也应该负责打印错误消息。想象一下,如果您在不同的上下文中使用getNameIndex()
,例如当程序由另一个程序运行或以自动方式运行时 - 那么打印到控制台将毫无意义。