gpt4 book ai didi

c++ - 在 C++ 中使用 sprintf 和 std::string

转载 作者:IT老高 更新时间:2023-10-28 23:11:31 26 4
gpt4 key购买 nike

我在 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;
}

除了每次检查预留空间是否足够之外,还有更好的方法吗?为了将来添加更多东西的可能性。

最佳答案

您的构造 -- 写入 到从 c_str() 接收的缓冲区中 -- 是 未定义的行为,即使您检查了字符串的容量预先。 (返回值是一个指向 const char 的指针,函数本身标记为 const,这是有原因的。)

不要混合使用 C 和 C++,尤其是不适合写入内部对象表示。 (这破坏了非常基本的 OOP。)使用 C++,以确保类型安全,并且不会遇到转换说明符/参数不匹配,如果没有别的原因。

std::ostringstream s;
s << "Type=" << INDEX_RECORD_TYPE_SERIALIZATION_HEADER
<< " Version=" << FORMAT_VERSION
// ...and so on...
;
std::string output = s.str();

替代方案:

std::string output = "Type=" + std::to_string( INDEX_RECORD_TYPE_SERIALIZATION_HEADER )
+ " Version=" + std::to_string( FORMAT_VERSION )
// ...and so on...
;

关于c++ - 在 C++ 中使用 sprintf 和 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36908994/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com