我正在考虑在我们的项目中提出以下建议,以替代sprintf / snprintf。
这样做的动机是消除对缓冲区大小的考虑,并尽可能保留原始大小的便利。

std::string strprintf(const char *format, ...)
{
    std::string s;
    s.resize(128); // best guess
    char *buff = const_cast<char *>(s.data());

    va_list arglist;
    va_start(arglist, format);
    auto len = vsnprintf(buff, 128, format, arglist);
    va_end(arglist);

    if (len > 127)
    {
        va_start(arglist, format);
        s.resize(len + 1); // leave room for null terminator
        buff = const_cast<char *>(s.data());
        len = vsnprintf(buff, len+1, format, arglist);
        va_end(arglist);
    }
    s.resize(len);
    return s; // move semantics FTW
}
此代码是否存在任何固有问题?
用法示例:
auto s = strprintf("Hello %d world", 777);

最佳答案

事实证明,这里已经有很多讨论:

std::string formatting like sprintf

从主观上讲,我的版本仍然比那里的大多数内容简洁,但在功能上与该线程上提出的一些解决方案相同。

关于c++ - strprintf-此实现安全且可移植吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45608048/

10-13 08:10