当前位置:  开发笔记 > 编程语言 > 正文

使用没有手动分配缓冲区的sprintf

如何解决《使用没有手动分配缓冲区的sprintf》经验,为你挑选了3个好方法。

在我正在处理的应用程序中,日志记录工具使用sprintf格式化写入文件的文本.所以,像:

char buffer[512];
sprintf(buffer, ... );

当发送的消息对于手动分配的缓冲区而言变得太大时,这有时会导致问题.

有没有办法获得sprintf行为而无需像这样手动分配内存?

编辑:虽然sprintf是一个C操作,我正在寻找C++类型的解决方案(如果有的话!)让我得到这种行为......



1> Jason Coco..:

您可以使用asprintf(3)(注意:非标准)为您分配缓冲区,因此您无需预先分配它.



2> philant..:

不,你不能sprintf()用来分配足够的内存.替代方案包括:

用于snprintf()截断消息 - 不能完全解决您的问题,但可以防止缓冲区溢出问题

缓冲区加倍(或三倍或......) - 除非您处于受限环境中

使用C++ std::stringostringstream- 但是你将丢失printf格式,你必须使用<<运算符

使用类似printf的%运算符附带的Boost格式


请注意,snprintf()会告诉您需要多少空间,因此如果需要,可以使用两次,第一次使用静态缓冲区,如图所示,第二次使用动态分配的缓冲区.
-1表示第二个建议(缓冲区大小加倍.由于你不知道最大字符串长度,你不能保证它不会溢出,即使你将它乘以10亿.)

3> flolo..:

我也不知道一个避免分配的版本,但是如果C99 sprintfs允许作为字符串的NULL指针.效率不高,但这会给你完整的字符串(只要有足够的内存可用)而不会有溢出的风险:

length = snprintf(NULL, ...);
str = malloc(length+1);
snprintf(str, ...);


如果您正在使用MSVC运行时,您会发现snprintf返回负值而不是所需的长度.所以,如果你想在MSVC下需要长度,你需要使用不同的函数,_vscprintf [http://msdn.microsoft.com/en-us/library/w05tbk72.aspx]
推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有