程式編譯通過,執行後輸入帳號密碼卻無任何反應,疑似陷入無限迴圈或函數未正確返回。
void search(string name2, string keyword2, bool& nameb, bool& keywordb, node* root) {
node* p = root;
nameb = keywordb = false;
while (p) {
if (name2 < p->name) p = p->left;
else if (name2 > p->name) p = p->right;
else {
nameb = true;
if (keyword2 == p->keyword) keywordb = true;
else keywordb = false;
// 缺少 return 或 break,導致 while 迴圈持續執行,p 不變,無限迴圈
}
}
}
當找到節點(name2 == p->name)後,未跳出迴圈,p 指標不變,條件 while(p) 永真,程式掛死。
void search(string name2, string keyword2, bool& nameb, bool& keywordb, node* root) {
node* p = root;
nameb = keywordb = false;
while (p) {
if (name2 < p->name) p = p->left;
else if (name2 > p->name) p = p->right;
else {
nameb = true;
if (keyword2 == p->keyword) {
keywordb = true;
return; // 找到並密碼正確,直接返回
} else {
keywordb = false;
return; // 找到但密碼錯誤,直接返回
}
}
}
// 迴圈結束未找到節點,nameb、keywordb 保持 false
}
int main() {
// ... 建樹略 ...
string username, password;
cout << "請輸入帳號密碼: ";
cin >> username >> password;
bool nameOk, passOk;
search(username, password, nameOk, passOk, root);
if (nameOk && passOk) {
cout << "登入成功!" << endl;
} else if (nameOk && !passOk) {
// 密碼錯誤,允許重試
while (true) {
cout << "密碼錯誤,請重新輸入: ";
cin >> password;
search(username, password, nameOk, passOk, root);
if (passOk) {
cout << "登入成功!" << endl;
break;
}
}
} else {
cout << "帳號不存在" << endl;
}
return 0;
}
p == nullptr)、或發現不匹配並決定返回。bool& 僅用於回傳結果,不可作為迴圈控制變數。p 指標變化,能秒殺此類邏輯錯誤。嘗試將密碼改為雜湊值(如 SHA-256)儲存,並在 search 中比對雜湊,提升安全性。