#include <string>
#include <memory>
#include <cstring>
#include <cstdarg>
#include <cstdio>
static std::string string_format(const std::string fmt_str, ...)
{
int final_n, n = ((int)fmt_str.size()) * 2; /* Reserve two times as much as the length of the fmt_str */
std::unique_ptr<char[]> formatted;
va_list ap;
while(1) {
formatted.reset(new char[n]); /* Wrap the plain char array into the unique_ptr */
std::strcpy(&formatted[0], fmt_str.c_str());
va_start(ap, fmt_str);
final_n = vsnprintf(&formatted[0], n, fmt_str.c_str(), ap);
va_end(ap);
if (final_n < 0 || final_n >= n)
n += std::abs(final_n - n + 1);
else
break;
}
return std::string(formatted.get());
}
int main()
{
puts(string_format("%s %d", "test", 1).c_str());
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxjc3RkYXJnPgojaW5jbHVkZSA8Y3N0ZGlvPgoKc3RhdGljIHN0ZDo6c3RyaW5nIHN0cmluZ19mb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcgZm10X3N0ciwgLi4uKQp7CiAgICBpbnQgZmluYWxfbiwgbiA9ICgoaW50KWZtdF9zdHIuc2l6ZSgpKSAqIDI7IC8qIFJlc2VydmUgdHdvIHRpbWVzIGFzIG11Y2ggYXMgdGhlIGxlbmd0aCBvZiB0aGUgZm10X3N0ciAqLwogICAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gZm9ybWF0dGVkOwogICAgdmFfbGlzdCBhcDsKICAgIHdoaWxlKDEpIHsKICAgICAgICBmb3JtYXR0ZWQucmVzZXQobmV3IGNoYXJbbl0pOyAvKiBXcmFwIHRoZSBwbGFpbiBjaGFyIGFycmF5IGludG8gdGhlIHVuaXF1ZV9wdHIgKi8KICAgICAgICBzdGQ6OnN0cmNweSgmZm9ybWF0dGVkWzBdLCBmbXRfc3RyLmNfc3RyKCkpOwogICAgICAgIHZhX3N0YXJ0KGFwLCBmbXRfc3RyKTsKICAgICAgICBmaW5hbF9uID0gdnNucHJpbnRmKCZmb3JtYXR0ZWRbMF0sIG4sIGZtdF9zdHIuY19zdHIoKSwgYXApOwogICAgICAgIHZhX2VuZChhcCk7CiAgICAgICAgaWYgKGZpbmFsX24gPCAwIHx8IGZpbmFsX24gPj0gbikKICAgICAgICAgICAgbiArPSBzdGQ6OmFicyhmaW5hbF9uIC0gbiArIDEpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gc3RkOjpzdHJpbmcoZm9ybWF0dGVkLmdldCgpKTsKfQoKaW50IG1haW4oKQp7CglwdXRzKHN0cmluZ19mb3JtYXQoIiVzICVkIiwgInRlc3QiLCAxKS5jX3N0cigpKTsKfQ==