gpt4 book ai didi

c++ - 如何在 C++ 中解析和验证 std::string 中的日期?

转载 作者:可可西里 更新时间:2023-11-01 18:41:53 25 4
gpt4 key购买 nike

我正在做一个项目,我必须读取一个日期以确保它是一个有效日期。例如,2 月 29 日只是闰年的有效日期,或者 6 月 31 日不是有效日期,因此计算机会根据输入输出该信息。我的问题是我无法弄清楚如何解析字符串,以便用户可以输入“05/11/1996”作为日期(例如),然后将其放入单独的整数中。我正在考虑尝试用 while 循环和字符串流做一些事情,但我有点卡住了。如果有人可以帮助我解决这个问题,我将不胜感激。

最佳答案

可能的解决方案也可能基于 strptime , 但请注意,此函数仅验证日期是否来自间隔 <1;31>和来自 <1;12> 的月份,即 "30/02/2013"仍然有效:

#include <iostream>
#include <ctime>

int main() {
struct tm tm;
std::string s("32/02/2013");
if (strptime(s.c_str(), "%d/%m/%Y", &tm))
std::cout << "date is valid" << std::endl;
else
std::cout << "date is invalid" << std::endl;
}
但是因为 strptime并不总是可用,额外的验证会很好,这是你可以做的:
  1. 提取日、月、年
  2. 填写struct tm
  3. 规范化
  4. 检查标准化日期是否仍然与检索到的日、月、年相同

即:

#include <iostream>
#include <sstream>
#include <ctime>

// function expects the string in format dd/mm/yyyy:
bool extractDate(const std::string& s, int& d, int& m, int& y){
std::istringstream is(s);
char delimiter;
if (is >> d >> delimiter >> m >> delimiter >> y) {
struct tm t = {0};
t.tm_mday = d;
t.tm_mon = m - 1;
t.tm_year = y - 1900;
t.tm_isdst = -1;

// normalize:
time_t when = mktime(&t);
const struct tm *norm = localtime(&when);
// the actual date would be:
// m = norm->tm_mon + 1;
// d = norm->tm_mday;
// y = norm->tm_year;
// e.g. 29/02/2013 would become 01/03/2013

// validate (is the normalized date still the same?):
return (norm->tm_mday == d &&
norm->tm_mon == m - 1 &&
norm->tm_year == y - 1900);
}
return false;
}

用作:

int main() {

std::string s("29/02/2013");
int d,m,y;

if (extractDate(s, d, m, y))
std::cout << "date "
<< d << "/" << m << "/" << y
<< " is valid" << std::endl;
else
std::cout << "date is invalid" << std::endl;
}

在这种情况下会输出 date is invalid因为规范化会检测到 29/02/2013已标准化为 01/03/2013 .

关于c++ - 如何在 C++ 中解析和验证 std::string 中的日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19482378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com