1

我的程序正在尝试创建一个新帐户并将用户名与我的数据库中的用户名进行比较。1个来自用户输入,另一个来自向量。我必须遍历向量并比较两个字符串。但由于某些未知原因,它只比较 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”方法中的逻辑有问题。任何人都可以提出建议吗?谢谢!

4

2 回答 2

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();
于 2013-07-29T13:20:12.217 回答
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另一个答案所示

于 2013-07-29T14:49:43.637 回答