因此,我正在创建一个社交媒体功能程序,并试图通过类似于标签的用户输入将字符串存储到字符串向量中。但是在将它们存储到向量中之前,必须通过在字符串之前使用井号符号来对其进行验证。如果有效,则标签将存储到向量中;如果无效,则应重复用户输入提示,直到有效。
Post.cpp
#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;
}
Main.cpp
#include "pch.h"
Post p;
int main()
{
int i = 0;
std::string poster;
std::cout << "Poster: ";
std::cin >> poster;
p.setPoster(poster);
std::cout << p.getPoster() << std::endl;
std::cout << std::endl;
std::string message;
std::cout << "Message: ";
std::cin >> message;
p.setMessage(message);
std::cout << p.getMessage() << std::endl;
std::cout << std::endl;
std::vector<std::string> tags;
std::cout << "Tags: ";
std::cin >> tags[i];
p.setTags(tags);
std::cout << p.getTags().at(i) << std::endl;
std::cout << std::endl;
i++;
}
程序运行正常,但是当我到达标签用户输入提示时,程序崩溃,并给我一个调试断言失败的错误,提示“表达式:向量下标超出范围”。
答案 0 :(得分:0)
您仅犯了一个较小的逻辑错误。
由于user4581301已经在其评论中写过:
定义矢量时,它最初具有0个元素。含义,甚至不是元素0。因此,在
之后std::vector<std::string> tags;
标签不包含元素,甚至不包含tags[0]
。而且,如果您尝试使用tags[i]
向int i = 0;
中写入一个值,则会产生超出范围的错误。您在内存中随机写些东西。
如何避免这种情况?您可以在构造函数中创建具有给定大小的矢量,也可以使用矢量resize
或最好使用矢量,用于此用例:push_back()
。
将代码更改为:
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++;
当然还有其他可能性。但这很容易理解。