sscanf 与 std::string_view

问题描述 投票:0回答:1

std::string_view
不是以 0 结尾的,所以我不能使用
sscanf
。 Microsoft CRT 有 _snscanf_s,它接受缓冲区长度。有任何 POSIX 替代品吗?

TIMESTAMP_STRUCT StringToTimestamp(std::string_view dTime, bool dayfirst) noexcept
{
    TIMESTAMP_STRUCT t{};
    int res;
    if (dayfirst)
        res = _snscanf_s(dTime.data(), dTime.size(), "%2hu.%2hu.%4hd %2hu:%2hu:%2hu", &t.day, &t.month, &t.year, &t.hour, &t.minute, &t.second);
    else
        res = _snscanf_s(dTime.data(), dTime.size(), "%4hd-%2hu-%2hu %2hu:%2hu:%2hu", &t.year, &t.month, &t.day, &t.hour, &t.minute, &t.second);

    if (res == 6)
        return t; // success

    if (!dTime.empty() && dTime != "0") // log if not empty or 0
        Common::Log::Instance()->TraceFatal("StringToTimestamp failed");
    return {};
}
c++ linux posix c++20
1个回答
0
投票

还没有,但是有一些扩展。 您仍然可以使用 sscanf。只要确保您没有读取数据的末尾即可。

请注意,所有格式说明符都有宽度参数,它指定要读取的最大字符数。

在你的例子中,实际上所有的说明符都有宽度。 所以你可以根据你的格式检查 std::string_view.size() 。 std::string_view.size() >= 19 和 std::string_view.size() >= 21

对于您的示例,有 strftime,其中包括 maxsize 参数。

© www.soinside.com 2019 - 2024. All rights reserved.