C++ 用户将字符串输入字符串向量并验证它
因此,我正在创建一个社交媒体功能程序,并试图通过用户输入将字符串存储到字符串向量中,就像标签一样。但是,在将它们存储到向量中之前,必须通过在字符串之前使用hashtag符号来验证它们。如果有效,标记将存储到向量中,但如果无效,则应重复用户输入提示,直到其有效 Post.cppC++ 用户将字符串输入字符串向量并验证它,c++,C++,因此,我正在创建一个社交媒体功能程序,并试图通过用户输入将字符串存储到字符串向量中,就像标签一样。但是,在将它们存储到向量中之前,必须通过在字符串之前使用hashtag符号来验证它们。如果有效,标记将存储到向量中,但如果无效,则应重复用户输入提示,直到其有效 Post.cpp #include "pch.h" //Regex std::string posterRegex = "[A-Za-z0-9]{8,}"; std::string messageRegex = "[A-Za-z0-9]{
#include "pch.h"
//Regex
std::string posterRegex = "[A-Za-z0-9]{8,}";
std::string messageRegex = "[A-Za-z0-9]{1,}";
//Validates data against a user-defined string
bool validatePost(std::string regexStr, std::string data)
{
return std::regex_match(data, std::regex(regexStr));
}
bool validateVector(const std::vector<std::string> &in)
{
return std::none_of(std::begin(in), std::end(in), [](std::string
const &s)
{
return s.find("#") == std::string::npos;
});
}
Post::Post()
{
}
Post::Post(std::string poster, std::string message,
std::vector<std::string> tags, std::vector<User*> taggedUsers)
{
setPoster(poster);
setMessage(message);
setTags(tags);
setTaggedUsers(taggedUsers);
}
Post::~Post()
{
}
void Post::setPoster(std::string poster)
{
for (;;)
{
bool bValid = validatePost(posterRegex, poster);
if (bValid)
{
this->poster = poster;
break;
}
else
{
std::cout << "Please enter a valid name!\n";
std::cout << std::endl;
std::cout << "Poster: ";
std::cin.clear();
std::cin.ignore(512, '\n');
std::cin >> poster;
}
}
}
void Post::setMessage(std::string message)
{
for (;;)
{
bool bValid = validatePost(messageRegex, message);
if (bValid)
{
this->message = message;
break;
}
else
{
std::cout << "Please enter a valid message!\n";
std::cout << std::endl;
std::cout << "Message: ";
std::cin.clear();
std::cin.ignore(512, '\n');
std::cin >> message;
}
}
}
void Post::setTags(std::vector<std::string> tags)
{
for (;;)
{
int i = 0;
bool bValid = validateVector(tags);
if (bValid)
{
this->tags = tags;
break;
}
else
{
std::cout << "Please enter a valid tag(s)!\n";
std::cout << std::endl;
std::cout << "Tag(s): ";
std::cin.clear();
std::cin.ignore(512, '\n');
std::cin >> tags[i];
}
}
}
std::ostream & operator<<(std::ostream& osObject, const Post& coObject)
{
osObject << coObject.poster << " - " << coObject.message;
return osObject;
}
#包括“pch.h”
//正则表达式
std::string posterRegex=“[A-Za-z0-9]{8,}”;
std::string messageRegex=“[A-Za-z0-9]{1,}”;
//根据用户定义的字符串验证数据
bool validatePost(std::string regexStr,std::string数据)
{
返回std::regex_匹配(数据,std::regex(regexStr));
}
布尔validateVector(常量标准::向量和输入)
{
返回std::none_of(std::begin(in),std::end(in),[](std::string
康斯特(s&s)
{
返回s.find(“#”)==std::string::npos;
});
}
Post::Post()
{
}
Post::Post(std::string海报、std::string消息、,
std::vector标记,std::vector标记
{
海报(海报),;
设置消息(消息);
设置标签(标签);
设置taggedUsers(taggedUsers);
}
Post::~Post()
{
}
void Post::setPoster(std::string poster)
{
对于(;;)
{
bool bValid=validatePost(posterRegex,海报);
if(bValid)
{
这个->海报=海报;
打破
}
其他的
{
std::cout message=消息;
打破
}
其他的
{
std::cout tags=标签;
打破
}
其他的
{
std::cout您只犯了一个小的逻辑错误
正如user4581301在其评论中所述:
当你定义一个向量时,它最初有0个元素。这意味着,甚至不是元素0。所以,在
std::vector<std::string> tags;
当然还有其他的可能性。但这很容易理解。std::cin>>标记[i];
如果没有标记[i]
?例如,标记
是空的?有时,当你必须对付这样的错误时,它们会走遍你的全身。当我到达标记用户输入提示符时,程序崩溃了——程序实际上并没有崩溃。你收到了一个暂停程序的断言——崩溃意味着程序只是因为错误而突然停止工作内存冲突或类似错误。--并给我一个调试断言失败的错误,说“表达式:向量下标超出范围”--好的,那么错误消息中的内容不被理解?我似乎很清楚问题是什么。
std::vector<std::string> tags;
std::vector<std::string> tags;
std::cout << "Tags: ";
std::string strTag;
if (std::cin >> strTag)
tags.push_back(strTag);
p.setTags(tags);
std::cout << p.getTags().at(i) << std::endl;
std::cout << std::endl;
i++;