首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C++中解析8位数据?

如何在C++中解析8位数据?
EN

Stack Overflow用户
提问于 2021-11-04 13:48:47
回答 1查看 146关注 0票数 0

我使用std::get_time解析文本中的日期。在大多数情况下,这是足够的,但当没有分隔符(例如31122021,格式"%d%m%Y")读取日期时,我总是会失败。我使用它是因为我看到它被描述为相当于python的strptime (https://stackoverflow.com/a/33542189/15061775),它确实管理这个用例(如何将8位数解析为日期?)。

下面是我的代码(经过测试的MRE):

代码语言:javascript
复制
#include <cassert>
#include <ctime>
#include <iomanip>
#include <sstream>

#define MAKEDATE(d,m,y) (((y&0xFFFF)<<16)|((m&0xFF)<<8)|(d&0xFF))
uint32_t Get_Date(const char *str_date, const char **out, const char *format)
{
    std::tm dt = {};
    std::istringstream stream(str_date);
    stream >> std::get_time(&dt, format);
    if (stream.fail())
    {
        if (out) *out = NULL;
        return MAKEDATE(1, 1, 1900);
    }
    else
    {
        if (out) *out = str_date + (int)stream.tellg();
        return MAKEDATE(dt.tm_mday, 1 + dt.tm_mon, 1900 + dt.tm_year);
    }
}

int main(void)
{
    assert(Get_Date("31122021", NULL, "%d%m%Y") == MAKEDATE(31, 12, 2021));
}

我使用it 2017的默认编译器设置使用MFC和CLI编译它,使用MSVC 19.10.25027。

我搞错了吗?我还能用其他的旗子或一组旗子吗?还有另外一种简单的解析方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-05 10:28:29

这是编译器特有的问题。如果这个特定的方法需要处理这个特定的输入,那么您必须使用不同的编译器。

引用这个链接

看来,MSVC14.0中的std::get_time不解析未分隔的日期和时间值,例如在ISO8601基本格式中找到的日期和时间值。下面的代码在MSVC中失败,但在GCC 5.2中工作正常。

似乎大家都知道:< link>已不复存在,很老了

可以得出结论,MSVC编译的std::get_time从未能够解析非分离的输入。据报道GCC在工作,而CLang肯定会工作,所以MSVC是最奇怪的。

如果切换编译器不值得麻烦,那么更具体的解析方法就可以了。

代码语言:javascript
复制
// Assuming str_date is guaranteed to be 8 digits
uint32_t Get_Date_YMD(const char *str_date)
{
    return
        (((str_date[0] - '0') * 1000 +
        (  str_date[1] - '0') * 100 +
        (  str_date[2] - '0') * 10 +
        (  str_date[3] - '0')) << 16) |
        (((str_date[4] - '0') * 10 +
        (  str_date[5] - '0')) << 8) |
        (( str_date[6] - '0') * 10 +
        (  str_date[7] - '0'));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69840271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档