C++字符串比较逻辑异常,邮箱验证循环无法按预期退出问题排查
问题根因
- 后缀校验逻辑完全不符合需求:当前遍历合法后缀列表时,只要遇到任意一个后缀没在邮箱中找到,就直接判定校验失败并终止遍历,等同于要求邮箱必须同时包含所有合法后缀才能通过校验。
- 隐藏逻辑缺陷:仅用
find方法匹配字符串会出现误判,比如test@gmail.com.cn这类中途包含合法后缀字符串的邮箱也会被错误判定为符合要求。
修正方案
调整校验逻辑为:先校验两次输入邮箱是否一致,不一致直接进入下一轮循环;校验后缀时只要匹配到任意一个合法后缀就判定通过,所有后缀都不匹配才输出错误。同时新增后缀位置校验,确保合法后缀必须出现在邮箱末尾。
修正后完整代码
#include <iostream> #include <string> using namespace std; int main() { string emailOne_, emailTwo_; bool valid = false; const string validSuffix[] = {"@gmail.com", "@yahoo.com"}; const int suffixCount = sizeof(validSuffix) / sizeof(validSuffix[0]); do { cout << "Email: "; cin >> emailOne_; cout << "Re-enter email: "; cin >> emailTwo_; // 校验两次输入是否一致 if (emailOne_ != emailTwo_) { valid = false; cerr << "\t[*] ERROR: EMAILS DO NOT MATCH\n\n"; continue; } // 校验是否匹配任意合法后缀 bool suffixValid = false; for (int i = 0; i < suffixCount; i++) { // 限制后缀必须在邮箱末尾,避免误判 if (emailOne_.size() >= validSuffix[i].size() && emailOne_.substr(emailOne_.size() - validSuffix[i].size()) == validSuffix[i]) { suffixValid = true; break; } } if (!suffixValid) { valid = false; cerr << "\t[*] ERROR: EMAILS MUST HAVE @gmail.com or @yahoo.com\n\n"; } else { valid = true; } } while (!valid); cout << "\t[+] Email validation passed!" << endl; return 0; }
内容的提问来源于stack exchange,提问作者Glitchen
相关产品推荐
相关产品推荐

