strprintf - 这种实现安全且便携吗?

时间:2017-08-10 08:14:35

标签: c++ printf stdstring

我正在考虑在我们的项目中提出以下内容作为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);

1 个答案:

答案 0 :(得分:0)

原来这里已经有很多讨论了这个问题:

std::string formatting like sprintf

主观上,我的版本看起来仍然比那里的大多数东西更简洁,但它在功能上与该线程上提出的一些解决方案相同。