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