我正在考虑在我们的项目中提出以下内容作为sprintf / snprintf的替代方案。
目的是消除考虑缓冲区大小的需要,并尽可能保持原始的便利性。
std::string strprintf(const char *fromat, ...)
{
std::string s;
s.resize(128); // best guess
char *buff = const_cast<char *>(s.data());
va_list arglist;
va_start(arglist, fromat);
auto len = vsnprintf(buff, 128, fromat, arglist);
va_end(arglist);
if (len > 127)
{
va_start(arglist, fromat);
s.resize(len + 1); // leave room for null terminator
buff = const_cast<char *>(s.data());
len = vsnprintf(buff, len+1, fromat, arglist);
va_end(arglist);
}
s.resize(len);
return s; // move semantics FTW
}
此代码是否存在任何固有问题?
用法示例:
auto s = strprintf("Hello %d world", 777);
答案 0 :(得分:0)
原来这里已经有很多讨论了这个问题:
std::string formatting like sprintf
主观上,我的版本看起来仍然比那里的大多数东西更简洁,但它在功能上与该线程上提出的一些解决方案相同。