我在 C++ 11 中使用 sprintf
函数,方式如下:
std::string toString()
{
std::string output;
uint32_t strSize=512;
do
{
output.reserve(strSize);
int ret = sprintf(output.c_str(), "Type=%u Version=%u ContentType=%u contentFormatVersion=%u magic=%04x Seg=%u",
INDEX_RECORD_TYPE_SERIALIZATION_HEADER,
FORAMT_VERSION,
contentType,
contentFormatVersion,
magic,
segmentId);
strSize *= 2;
} while (ret < 0);
return output;
}
有没有更好的方法来做到这一点,而不是每次检查预留空间是否足够?为了将来添加更多东西的可能性。
原文由 Dan The Man 发布,翻译遵循 CC BY-SA 4.0 许可协议
即使您事先检查了字符串的容量,您的构造 - 写入 从
c_str()
接收的缓冲区也是 未定义的行为。 (返回值是指向 const char 的指针,函数本身标记为 const ,这是有原因的。)不要混合使用 C 和 C++, 尤其是 不要写入内部对象表示。 (这破坏了非常基本的 OOP。)使用 C++,以确保类型安全,并且不会遇到转换说明符/参数不匹配,如果没有别的。
选择: