【问题标题】:How to parse date format from std::cin into stringstream buffer in c++? [duplicate]c++ - 如何将std :: cin中的日期格式解析为c ++中的stringstream缓冲区? [复制]
【发布时间】:2020-11-17 21:56:29
【问题描述】:

有这个课程:

date.hpp

#ifndef DATE_HPP
#define DATE_HPP

#include <time.h>
#include <iostream>
#include <sstream>

class Date
{
    std::stringstream format;
    time_t date;
    struct tm *date_tm;

public:
    Date() : date(time(NULL)), date_tm(localtime(&date)) {}
    Date(std::istream &in);
    Date(std::string str);

    const std::string getDate();
    const bool dateMatch(std::string str);
};

#endif //DATE_HPP

还有这个演员:date.cpp

#include "date.hpp"
#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
#include <regex>

bool isDate(std::string target)
{
    std::regex reg("[1-12]{2}/[1-31]{2}[00-99]{2}");
    return std::regex_search(target, reg);
}

Date::Date(std::istream &in)
{
    date_tm = new struct tm;
    std::cout << "enter date [mm/dd/yy]: ";
    format.basic_ios::rdbuf(in.rdbuf());

    if (isDate(format.str()))
    {
        format >> std::get_time(date_tm, "%m/%d/%y");
    }
    else
    {
        std::cout << "Format of date is not valid\n";
    }
}
...

如果我尝试使用带有std::istream 参数的ctor:

#include "date.hpp"
#include <iostream>

using namespace std;

int main()
{
    Date d(cin);
    cout << d.getDate() << '\n';
}

然后,日期格式检查甚至在我可以写入 cin 之前就失败了。现在怎么了?

【问题讨论】:

  • 哦,男孩,请不要在这样的构造函数中写信给cout。如果您需要像文件流一样从cin 以外的流中实例化Date 怎么办?
  • 那么我应该如何警告用户日期格式错误?
  • 我的意思主要是提示std::cout &lt;&lt; "enter date [mm/dd/yy]: ";。错误条件可以通过异常或状态代码来表示。调用代码可以决定在这种情况下要做什么,比如写一条错误消息。
  • 好的,谢谢,我会编辑的。

标签: c++ regex buffer istream


【解决方案1】:

你的格式应该是"%m/%d/%Y"。请参阅:https://en.cppreference.com/w/cpp/io/manip/get_time。此外,您的正则表达式缺少'/'。再加上您的正则表达式数字范围不太正确;它们匹配一个字符类,而不是一个数字。 "[1-12]" 我认为仅匹配单字符字符串 "1""2"。你需要对数字范围做一些不同的事情。您可以通过检查 format.fail() 是否为 true 而不是运行正则表达式来检查日期解析是否失败。另外,我对您初始化format 的方法持怀疑态度。我觉得还是写比较好

std::string s;
std::getline(std::cin, s);
std::stringstream format(s);

.

【讨论】:

    猜你喜欢
    • 2021-09-22
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2011-06-27
    • 2010-12-23
    相关资源
    最近更新 更多