有时候你需要使用C函数构造的字符来填充一个
请注意,我们首先需要填充本地缓冲区,然后将其复制到
如果最大缓冲区大小是计算出来的,而不一定是您想要存储在堆栈上的内容,则示例变得更加复杂。例如:
这使得代码变得更加复杂,如果calculatedBufferSize大于我们想要的堆栈大小,我们实际上会执行以下操作:
我的实验表明,最后的resize是必要的,以确保字符串的长度正确报告。
请注意,我们的分配和复制要少得多:
请不要参考问题Manipulating std::string,因为那个问题涉及到更加混乱的逻辑(甚至使用了
std::string
。一个典型的例子是这样的:constexpr static BUFFERSIZE{256};
char buffer[BUFFERSIZE];
snprint (buffer, BUFFERSIZE, formatstring, value1, value2);
return std::string(buffer);
请注意,我们首先需要填充本地缓冲区,然后将其复制到
std::string
中。如果最大缓冲区大小是计算出来的,而不一定是您想要存储在堆栈上的内容,则示例变得更加复杂。例如:
constexpr static BUFFERSIZE{256};
if (calculatedBufferSize>BUFFERSIZE)
{
auto ptr = std::make_unique<char[]>(calculatedBufferSize);
snprint (ptr.get(), calculatedBufferSize, formatstring, value1, value2);
return std::string(ptr.get());
}
else
{
char buffer[BUFFERSIZE];
snprint (buffer, BUFFERSIZE, formatstring, value1, value2);
return std::string(buffer);
}
这使得代码变得更加复杂,如果calculatedBufferSize大于我们想要的堆栈大小,我们实际上会执行以下操作:
- 分配内存(make_unique)
- 将内存填充为所需结果
- 分配内存(std::string)
- 将内存复制到字符串中
- 释放内存
std::string
有一个非const的data()
方法,这意味着这是操作字符串的方式。因此,这样做似乎很诱人:std::string result;
result.resize(calculatedBufferSize);
snprint (result.data(), calculatedBufferSize, formatstring, value1, value2);
result.resize(strlen(result.c_str()));
return result;
我的实验表明,最后的resize是必要的,以确保字符串的长度正确报告。
std::string::length()
不会搜索nul终止符,它只返回大小(就像std::vector
一样)。请注意,我们的分配和复制要少得多:
- 分配内存(调整字符串大小)
- 用所需结果填充内存
请不要参考问题Manipulating std::string,因为那个问题涉及到更加混乱的逻辑(甚至使用了
memset
)。同时,请不要回答我必须使用C++流(std::string_stream
,高效吗?老实说?)。有时候你只是想重用C语言中的高效逻辑。
calculatedBufferSize
不等于strlen(result)
呢? - Zang MingJie