如果不有效,如何重复用户输入电子邮件
How to repeat a user input email if not valid
因此,我正在尝试在电子邮件设置器中使用一个循环,如果它不有效,则应重复用户输入电子邮件提示。问题是,如果我首先输入有效的电子邮件,它将打破我想要的循环,但是如果我先输入无效的电子邮件,它将重复两次循环,然后如果我在此之后输入有效的电子邮件仍然会重复循环,我只是卡在一个无限的循环中。我知道我可能在做一些愚蠢的事情,但我似乎无法正常工作。
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;
}
相关文章:
- C++如何通过用户输入删除列表元素
- 如何使用用户输入在C++中正确填充2D数组
- C++MySQL C api用户输入行
- 如何只允许用户输入正整数
- C++如何计算用户输入的数字中的偶数位数
- 通过for循环使用用户输入填充列表
- 在C++中,我如何接受不同于同一行的用户输入
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 显示基于用户输入的整数的字符
- 根据用户输入用字母填充矢量,并将"开始"和"结束"放在四肢
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 打印时有二叉树问题.用户输入不打印任何内容
- C ++奇怪的数组由用户输入
- 如何允许大写和小写用户输入?
- C++读取用户输入而不按回车键(Mac OS X),与Turbo Pascal中的读取键相同
- 如何存储用户输入的所有数据,然后在他们想要查看所有数据时显示它们
- 如何使用用户输入变量制作二维数组?
- 用户输入字符串的文件附加问题..C++
- 遇到此问题时遇到困难:允许用户输入数组的值并使用 for,而循环也输出输入的最大数字
- 如何使用递归循环我的代码(当用户输入无效输入时,它会再次提示他们)?