在我正在处理的应用程序中,日志记录工具使用sprintf
格式化写入文件的文本.所以,像:
char buffer[512]; sprintf(buffer, ... );
当发送的消息对于手动分配的缓冲区而言变得太大时,这有时会导致问题.
有没有办法获得sprintf
行为而无需像这样手动分配内存?
编辑:虽然sprintf
是一个C操作,我正在寻找C++类型的解决方案(如果有的话!)让我得到这种行为......
您可以使用asprintf(3)(注意:非标准)为您分配缓冲区,因此您无需预先分配它.
不,你不能sprintf()
用来分配足够的内存.替代方案包括:
用于snprintf()
截断消息 - 不能完全解决您的问题,但可以防止缓冲区溢出问题
缓冲区加倍(或三倍或......) - 除非您处于受限环境中
使用C++ std::string
和ostringstream
- 但是你将丢失printf格式,你必须使用<<运算符
使用类似printf的%运算符附带的Boost格式
我也不知道一个避免分配的版本,但是如果C99 sprintfs允许作为字符串的NULL指针.效率不高,但这会给你完整的字符串(只要有足够的内存可用)而不会有溢出的风险:
length = snprintf(NULL, ...); str = malloc(length+1); snprintf(str, ...);