You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 02:24:03