用户将字符串输入字符串向量并进行验证

时间:2019-08-07 16:48:49

标签: c++

因此,我正在创建一个社交媒体功能程序,并试图通过类似于标签的用户输入将字符串存储到字符串向量中。但是在将它们存储到向量中之前,必须通过在字符串之前使用井号符号来对其进行验证。如果有效,则标签将存储到向量中;如果无效,则应重复用户输入提示,直到有效。

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

程序运行正常,但是当我到达标签用户输入提示时,程序崩溃,并给我一个调试断言失败的错误,提示“表达式:向量下标超出范围”。

1 个答案:

答案 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++;

当然还有其他可能性。但这很容易理解。