vsnprintf长度

来源:互联网 发布:域名和域名空间 编辑:程序博客网 时间:2024/05/22 07:51

由于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;}


0 0