C++ std::strftime的返回值
我想我在某个地方读到,如果我将null ptr传递给,函数将返回所需的缓冲区大小。事实上,以下代码在我尝试过的许多linux系统上都能很好地工作(但在使用VS编译时却不行):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
#包括
#包括
#包括
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;
}