我希望有一个函数,它可以接受一个time_t参数和任意格式的字符串,并进行格式化。我需要类似于以下代码的函数:
std::string GetTimeAsString(std::string formatString, time_t theTime)
{
struct tm *timeinfo;
timeinfo = localtime( &theTime);
char buffer[100];
strftime(buffer, 100, formatString.c_str(), timeinfo);
std::string result(buffer);
return result;
}
然而,我遇到的一个问题是缓冲区长度。我正在考虑像formatString * 4这样的东西作为缓冲区长度。但是我猜你不能动态设置缓冲区长度?也许我可以选择一个任意大的缓冲区?我有点困惑如何使它通用。
我该如何编写一个函数来实现这个目标?
data
是正确的。然而,在C++11中:§21.4.1/5对于任何basic_string对象s,当0 <= n < s.size()时,恒有&*(s.begin() + n) == &*s.begin() + n
,以及§21.4.5/2reference operator[](size_type pos) noexcept; ... 如果pos < size()则返回:*(begin() + pos)
。从技术上讲,我对于&buffer[0]
是合法的,但不适用于buffer.c_str()
或buffer.data()
。 - Mooing Duck%p
)可能会产生一个空字符串(取决于语言环境),这与错误无法区分,这种情况下你将得到一个无限循环。我目前找到的唯一解决方法是在格式字符串的末尾添加任意字符(例如空格),这允许区分空结果和错误,并在返回字符串之前删除该杂项字符。 - syamstrftime
返回格式化字符串的长度,不包括尾随的空字符,因此您最后的resize(len-1)
在这里是不正确的,它应该只是resize(len)
(除非您应用了我在先前评论中提到的hack,在这种情况下,删除一个字符确实是有意义的)。 - syamstd::bad_alloc
异常,但你的观点仍然正确) - Mooing Duck