我想我在某处读到如果我将nullptr传递给std::strftime,该函数将返回所需的缓冲区大小。实际上,以下代码在我尝试过的众多Linux系统上运行得非常好(不过在使用VS编译时):
#include <iostream>
#include <ctime>
#include <string>
int main()
{
std::time_t time{};
std::tm const * ltime = std::localtime(&time);
const char * formatString = "%Y-%b-%d";
//allocate buffer of appropriate size
auto requiredSize = 1 + std::strftime(nullptr, 50, formatString, ltime);
std::cout << "Required buffer size:" << requiredSize << "\n";
//Format time to string
std::string buff(requiredSize, ' ');
std::strftime(&buff[0], requiredSize, formatString, ltime);
std::cout << buff << std::endl;
}
但是,我无法找到原始来源或任何其他指定此行为的文档。所以我的问题是:
编辑:我添加了C标签,因为我已经看到了相同的C代码相同的结果,至少使用gcc / g ++(或者更确切地说是glibc / libstdc ++)std::strftime
可能只是一个别名无论如何,c函数strftime
。
答案 0 :(得分:4)
据我所知,正如其他人在评论中所写,根据ISO C或C ++标准,上述代码很可能是未定义的行为,并且就我自己的实验而言,在使用VS2015进行编译时会崩溃。 / p>
然而,就glibc而言,@rici就是现场:
来自The GNU C Library的文档:
如果s是空指针,strftime实际上不会写任何东西,而是返回它将写入的字符数。