我正在寻找一种实现sprintf()功能的方法std::string,我从std :: string格式如sprintf找到了一个很好的答案.这有点不好看,因为它直接写入从返回的指针string.c_str().所以我使用char *with 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;
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以这样做:
str = std::string(buffer);
Run Code Online (Sandbox Code Playgroud)
但它必须基本上做到strlen(buffer).我可以通过以下方式改善它:
str = std::string(buffer, size);
Run Code Online (Sandbox Code Playgroud)
但是string.swap()通过交换内部缓冲区而不是复制它会更有效吗?
str.swap(std::string(buffer, size));
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?