为什么不用匈牙利命名法
记一次修复MiniGUI相关Bug的过程

用printf的风格格式化std::string

fool posted @ 2011年3月18日 21:16 in C/C++ with tags c++ , 12147 阅读

一直很偏爱C风格的printf式格式化字符串,清晰而且高效。但是很遗憾C++的std::string并不支持这种格式化方法,只能用丑陋的ostringstream来模仿:

 std::ostringstream os;
 os << "Hello test " << someint << ' ' << somestring;
 std::string buffer(os.str());

不过我们可以自己写一个:

#include <stdio.h>
#include <stdarg.h>

std::string format(const char *fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);

    const size_t SIZE = 512;
    char buffer[SIZE] = { 0 };
    vsnprintf(buffer, SIZE, fmt, ap);

    va_end(ap);

    return std::string(buffer);
}

原理很简单,vsnprintf可以直接使用变长变量列表来格式化字符串,我们只需要提供一个返回std::string的变长变量函数,然后使用vsnprintf来进行格式化操作即可。

当然还有几个小问题:buffer是固定字长的,会截断结果;返回的std::string需要对buffer进行一次复制,略有效率损失。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter