我正在考虑在我们的项目中提出以下建议,以替代sprintf / snprintf。
这样做的动机是消除对缓冲区大小的考虑,并尽可能保留原始大小的便利。
std::string strprintf(const char *format, ...)
{
std::string s;
s.resize(128); // best guess
char *buff = const_cast<char *>(s.data());
va_list arglist;
va_start(arglist, format);
auto len = vsnprintf(buff, 128, format, arglist);
va_end(arglist);
if (len > 127)
{
va_start(arglist, format);
s.resize(len + 1); // leave room for null terminator
buff = const_cast<char *>(s.data());
len = vsnprintf(buff, len+1, format, arglist);
va_end(arglist);
}
s.resize(len);
return s; // move semantics FTW
}
此代码是否存在任何固有问题?用法示例:
auto s = strprintf("Hello %d world", 777);
最佳答案
事实证明,这里已经有很多讨论:
std::string formatting like sprintf
从主观上讲,我的版本仍然比那里的大多数内容简洁,但在功能上与该线程上提出的一些解决方案相同。
关于c++ - strprintf-此实现安全且可移植吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45608048/