如果不有效,如何重复用户输入电子邮件

How to repeat a user input email if not valid

本文关键字:用户 输入 电子邮件 何重复 有效 如果不      更新时间:2023-10-16

因此,我正在尝试在电子邮件设置器中使用一个循环,如果它不有效,则应重复用户输入电子邮件提示。问题是,如果我首先输入有效的电子邮件,它将打破我想要的循环,但是如果我先输入无效的电子邮件,它将重复两次循环,然后如果我在此之后输入有效的电子邮件仍然会重复循环,我只是卡在一个无限的循环中。我知道我可能在做一些愚蠢的事情,但我似乎无法正常工作。

user.cpp

#include "pch.h"
#include "User.h"
//Email regex
std::string userEmailRegex = ".+@.+";
//Validates data against a user-defined string
bool validate(std::string regexStr, std::string data)
{
    return std::regex_match(data, std::regex(regexStr));
}
User::User()
{
}
User::User(std::string email, std::string password, std::string username)
{
    setEmail(email);
    setPassword(password);
    setUsername(username);
}
User::~User()
{
}
void User::setEmail(std::string email)
{
    bool bValid = validate(userEmailRegex, email);
    for (;;)
    {
        if (bValid)
        {
            this->email = email;
            break;
        }
        else
        {
            std::cout << "Please enter a valid email adress!n";
            std::cout << "Email: ";
            std::cin.clear();
            std::cin.ignore(512, 'n');
        }
    }
}

main.cpp

#include "pch.h"
#include "User.h"
#include "DkDateTime.h"
User u;
int main()
{
    std::cout << "Welcome to MySocialNetwork!n"; 
std::cout << "Please Login below:n";
std::cout << std::endl;
std::vector<User> v;
std::string email;
std::cout << "Email: ";
std::cin >> email;
u.setEmail(email);
std::cout << u.getEmail() << std::endl;
std::cout << std::endl;
}

看起来您已经放错了验证代码,在SeteMail代码中,您从未存储过用户输入的电子邮件

void User::setEmail(std::string email)
{
    for (;;)
    {
        bool bValid = validate(userEmailRegex, email);
        if (bValid)
        {
            this->email = email;
            break;
        }
        else
        {
            std::cout << "Please enter a valid email adress!n";
            std::cout << "Email: ";
            std::cin.clear();
            std::cin.ignore(512, 'n');
            std::cin >> email;
        }
    }
}

因此,如果您将bool bValid = validate(userEmailRegex, email);转移到循环中,则应获得预期的结果。

obs:未经测试,但应该让您迈向正确的验证

您会收到一个电子邮件地址作为设置方法的参数,很好。但是,如果它是无效的,则循环循环询问stdin,内的,至少是一个可疑的设计。它将阻止在批处理上下文中或在服务中使用该类别从HTTP消息或其他不紧密绑定到终端的任何内容。

为了分离关注点,循环应不在用户类之外:这是UI关注点,而不是用户管理。IMHO您应该使validate成为User类静态方法,然后将循环移动到main函数:

//Validates data against a user-defined string
static bool User::validate(std::string data)
{
    //Email regex
    static std::string userEmailRegex = ".+@.+";
    return std::regex_match(data, std::regex(User::regexStr));
}
void User::setEmail(std::string email, bool validated = false)
{
    if (! (validated || validate(userEmailRegex, email))) {
        raise std::invalid_argument("Invalid email");
    }
    this->email = email;
}
int main()
{
    ...
    for (;;) {
        std::cout << "Email: ";
        std::cin >> email;
        if (User::validate(email)) {
            u.setEmail(email);
            break;
        }
        else {
            std::cout << "Please enter a valid email adress!n";
        }
    }
    std::cout << u.getEmail() << std::endl;
    std::cout << std::endl;
}