2013-07-29 40 views
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' 方法里面的逻辑。 任何人都可以提出建议吗? 谢谢!

+0

您只评估Vector中的一个项目,在第一个项目上返回* true *或* false *。这可能*不是你想要的。 –

+0

@JoachimPileborg我想要做的是,当用户输入用户名时,我会将它与我已经在我的数据库中拥有的用户名列表进行比较。然后,如果在数据库中找不到用户输入的用户名,这意味着用户名对用户有效。 –

+0

好的,但是如果找到匹配的话,你应该在循环中返回false,并且在循环之后返回true,当你知道没有找到匹配时。 –

回答

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,如其他答案所示

+0

不会为范围? – Puppy

+0

不,我不是。 OP表明他很难理解这是如何工作的(请参阅休息室)。此外,另一个答案显示了更加理智的方法,使用'std :: map'已经是 – sehe

+0

@sehe我现在明白了。它的if-else分支中的返回值的bcoz使其停止在向量的第一项。谢谢! –

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(); 
+0

返回循环完成?你的意思是什么? –

+0

@JoelSeah:我写了“...... *循环完成后”。 –