std :: strftime的返回值

时间:2016-08-24 19:47:49

标签: c++ c glibc

我想我在某处读到如果我将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

1 个答案:

答案 0 :(得分:4)

据我所知,正如其他人在评论中所写,根据ISO C或C ++标准,上述代码很可能是未定义的行为,并且就我自己的实验而言,在使用VS2015进行编译时会崩溃。 / p>

然而,就glibc而言,@rici就是现场:

来自The GNU C Library的文档:

  

如果s是空指针,strftime实际上不会写任何东西,而是返回它将写入的字符数。