sprintf()
私はで機能を実現する方法を探していましたが、 sprintfのようなstd::stringフォーマットstd::string
から良い答えを見つけました。ただし、から返されたポインタに直接書き込むため、これはややハッキーです。そこで、withとを使用して再実装しました。string.c_str()
char *
malloc()
realloc()
std::string string_format(const char * format, ...) {
size_t size;
size_t n;
va_list args;
char * buffer;
std::string str;
size = 100;
buffer = malloc(size);
for (;;) {
va_start(args, format);
n = vsnprintf(buffer, size, format, args);
va_end(args);
if (n > -1) {
if (n < size) {
size = n;
break;
}
size = n + 1;
} else {
size *= 2;
}
buffer = realloc(buffer, size);
}
str = std::string(buffer, size);
free(buffer);
return str;
}
私は私がただできることを知っています:
str = std::string(buffer);
しかし、それは本質的にしなければならないでしょうstrlen(buffer)
。私はそれを少し良くすることができます:
str = std::string(buffer, size);
しかしstring.swap()
、内部バッファをコピーする代わりにスワップすることで、より効率的に使用できますか?
str.swap(std::string(buffer, size));
これを行うためのより良い方法はありますか?