由于vsnprintf需要预先分派长度,所以并不能准确判断到底需要多长,这里通过首次分派1024来判断,若不够,后续继续分派,可得到格式化后的buffer和长度
//Handle buffer length of vsnprintf
#include <stdio.h>
#include <stdarg.h>
#include <iostream>
#include <tr1/memory>
typedef std::tr1::shared_ptr<std::string> StringPtr;
StringPtr format(const char* fmt, ...)
{
va_list ap;
va_start(ap, fmt);
StringPtr pbuf(new std::string(1024, '\0'));
int ret;
while ((ret = vsnprintf((char*)pbuf->c_str(), pbuf->size(), fmt, ap)) >= pbuf->size())
{
pbuf->resize(pbuf->size() * 2);
va_start(ap, fmt);
}
pbuf->resize(ret);
va_end(ap);
return pbuf;
}
int main()
{
StringPtr p = format("%d123456789%s", 0, "^**********************************************$");
std::cout<<p->size()<<" "<<*p<<std::endl;
}