我正在寻找一种实现sprintf()
功能的方法,并从std::string 格式(如 sprintfstd::string
)中找到了一个很好的答案。虽然这有点 hacky,因为它直接写入从. 所以我使用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));
有一个更好的方法吗?