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 {};
}
还没有,但是有一些扩展。 您仍然可以使用 sscanf。只要确保您没有读取数据的末尾即可。
请注意,所有格式说明符都有宽度参数,它指定要读取的最大字符数。
在你的例子中,实际上所有的说明符都有宽度。 所以你可以根据你的格式检查 std::string_view.size() 。 std::string_view.size() >= 19 和 std::string_view.size() >= 21
对于您的示例,有 strftime,其中包括 maxsize 参数。