如果无效,如何重复用户输入的电子邮件

时间:2019-07-08 13:53:43

标签: c++

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

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;
}

2 个答案:

答案 0 :(得分:2)

您似乎放错了验证代码,并且在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:未经测试,但可以帮助您进行正确的验证

答案 1 :(得分:1)

您会收到一个电子邮件地址,作为setter方法的参数,很好。但是,如果无效,那么您可以在setter方法中循环从stdin的处请求一个新字符串,这至少是一个有问题的设计。它将防止在批处理上下文中或在服务中使用该类,而该服务是从HTTP消息或未紧密绑定到终端的任何其他对象获取其输入的。

为了分离关注点,循环应该在用户类之外:这是UI关注点,而不是用户管理。恕我直言,您应将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;
}