我正在寻找一种通过sprintf()
获得std::string
功能的方法,我从std::string formatting like sprintf找到了一个很好的答案。这有点不好看,因为它直接写入从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));
有更好的方法吗?
答案 0 :(得分:9)
只需使用str.assign(buffer, size);