C++ std::strftime的返回值

C++ std::strftime的返回值,c++,c,glibc,C++,C,Glibc,我想我在某个地方读到,如果我将null ptr传递给,函数将返回所需的缓冲区大小。事实上,以下代码在我尝试过的许多linux系统上都能很好地工作(但在使用VS编译时却不行): #包括 #包括 #包括 int main() { std::time_t time{}; std::tm const*ltime=std::localtime(&time); 常量char*formatString=“%Y-%b-%d”; //分配适当大小的缓冲区 auto-requiredSize=1+std::strf

我想我在某个地方读到,如果我将null ptr传递给,函数将返回所需的缓冲区大小。事实上,以下代码在我尝试过的许多linux系统上都能很好地工作(但在使用VS编译时却不行):

#包括
#包括
#包括
int main()
{
std::time_t time{};
std::tm const*ltime=std::localtime(&time);
常量char*formatString=“%Y-%b-%d”;
//分配适当大小的缓冲区
auto-requiredSize=1+std::strftime(nullptr,50,formatString,ltime);

STD::CUT

正如我所知,正如其他人在评论中所说的,上面的代码是最有可能的未定义的行为,根据ISOC或C++标准,就我自己的实验而言,当用VS2015编译时会崩溃。

然而,就glibc而言,@rici的观点是:

根据以下文件:

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


Irrc你所声称的工作。我认为CPPrad需要更新。文档:检查最新C++标准的一个草稿。它记录库函数(但可能是引用C标准)。注意有一个一般规则:“除非它明确地说你可以,否则不能将NULL传递给库函数。”。我认为更有效的方法是创建堆栈缓冲区,然后直接通过堆栈缓冲区的地址和
std::strftime()的返回值来构造
std::string
,将相同的堆栈缓冲区与其余的格式参数一起传递给它。然后
std::strftime
填充堆栈缓冲区并返回正确的长度以直接构造
std:string
。这样可以节省调用
st::strftime
两次和填充
std::string
两次的时间。下面是一个示例:@mikemb这可能不是一个POSIX,它可能是一个未记录的GLUC扩展。如果你提到这个行为不是由C或C++标准或POSIX指定的,那么这个答案会被改进。对于GLUBC以外的实现,将空指针作为第一个参数传递给<代码> STFFTIME//C>有未定义的行为。(当然,返回有用的信息与未定义的行为完全一致。)狡辩:这是glibc的问题;它与gcc或g++没有直接关系。例如,您可以将clang或clang++用于glibc,也可以将gcc或g++用于其他库实现。@KeithThompson:修复。谢谢。
#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;
}