我的程序正在尝试创建一个新帐户,并将用户名与数据库中的用户名进行比较。 1来自用户输入,另一个来自矢量。我必须迭代向量并比较2个字符串。但由于某些未知原因,它只比较FIRST值而不是比较矢量中的所有值。
这是我的代码:
我的LoginAcc.cpp
class AccountInfo {
public:
string username;
string password;
string type;
};
bool LoginAcc::checkAccountNameValid(string username) {
vector <AccountInfo> accInfo;
AccountInfo user;
ifstream UserDatabase("UserDatabase.txt");
string line = "";
while (getline(UserDatabase,line)) {
stringstream linestream(line);
getline(linestream,user.username,':');
accInfo.push_back(user);
}
UserDatabase.close();
for(vector<AccountInfo>::iterator itr = accInfo.begin(); itr != accInfo.end(); ++itr) {
if (username.compare((*itr).username) != 0)
return true;
else
return false;
}
我的main.cpp
case 'n':
while (!flag) {
cout << "Please enter a username with 8 characters. " << endl;
cout << "Username : ";
cin >> username;
if (username.length() != 8) {
cout << "Username does not meet the requirements" << endl;
cout << "Username : ";
cin >> username;
}
else {
valid = login.checkAccountNameValid(username);
if (valid == true) {
cout << "Please enter a password with 8 characters." << endl;
cout << "Password : " << endl;
cin >> password;
cout << "1. Student" << endl;
cout << "2. Lecturer" << endl;
cout << "3. Admin" << endl;
cout << "Please choose the category you belong to : ";
cin >> category;
login.createNewAcc(username,password,category);
}
else {
cout << "Username has been taken. Please choose another. " << endl;
cout << "Username : ";
cin >> username;
}
}
}
break;
我觉得我的'checkAccountNameValid'方法中的逻辑有问题。 谁能提出建议? 谢谢!
答案 0 :(得分:3)
无论结果如何,内部循环都会返回调用者。在循环完成后你应该return false
。
另外,请勿使用username.compare((*itr).username) != 0
。这很令人困惑(可能为什么你错了(它应该是== 0
))你可以使用等于运算符:username == itr->username
,它是std::string
定义良好的(如果是你担心整体,“不要比较char *
使用平等!”的事情。
但你真正应该做的是将数据存储在用户名上的地图上并直接查找:
std::map<std::string, AccountInfo> accInfo;
⋮
return accInfo.find(username) != accInfo.end();
答案 1 :(得分:2)
for(vector<AccountInfo>::iterator itr = accInfo.begin(); itr != accInfo.end(); ++itr)
{
if (username.compare((*itr).username) != 0)
return true;
}
return false;
等待返回false
。
我还认为你可能会!= 0
反转:http://en.cppreference.com/w/cpp/string/basic_string/compare。
安排代码的另一种方法可能会为您提供更多线索:
bool found = false;
for(auto itr = accInfo.begin(); itr != accInfo.end(); ++itr)
{
if (username.compare(itr->username) == 0)
found = true;
}
return found;
更现代的方法是
bool found = std::find_if(accInfo.begin(), accInfo.end(),
[] (AccountInfo const& ai) { return username == ai.username; });
或者实际上,使用便于查找的数据结构,如std::map
,如另一个答案所示