sprintf// 有自动内存分配?
我在找 sprintf//-like实现自动分配必要的内存的函数。 所以我想说
和 my_str 提取包含此结果的分配内存的地址 sprintf//.
在另一个论坛中,我读到它可以像这样解决:
但它立即导致 segfault, 叫 sprintf// 用空指针。
那么,有想法,解决方案或提示? 销量的销售额 sprintf//-like, 在开放访问中,它已经足够了,然后我可以自己做。
非常感谢!
</string.h></stdio.h></stdlib.h>
char* my_str = dynamic_sprintf/ "Hello %s, this is a %.*s nice d string", a, b, c, d /;
和 my_str 提取包含此结果的分配内存的地址 sprintf//.
在另一个论坛中,我读到它可以像这样解决:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main//
{
char* ret;
char* a = "Hello";
char* b = "World";
int c = 123;
int numbytes;
numbytes = sprintf/ /char*/NULL, "%s %d %s!", a, c, b /;
printf/ "numbytes = %d", numbytes /;
ret = /char*/malloc/ / numbytes + 1 / * sizeof/ char / /;
sprintf/ ret, "%s %d %s!", a, c, b /;
printf/ "ret = >%s<\n", ret /;
free/ ret /;
return 0;
}
但它立即导致 segfault, 叫 sprintf// 用空指针。
那么,有想法,解决方案或提示? 销量的销售额 sprintf//-like, 在开放访问中,它已经足够了,然后我可以自己做。
非常感谢!
</string.h></stdio.h></stdlib.h>
没有找到相关结果
已邀请:
7 个回复
郭文康
赞同来自:
https://coderoad.ru/1775403/
. 如上所述,你需要
, 但不是
. 确保第二个论点
- 这是
. 这将防止录制
在截止日期
, 这是第一个论点。
第二个论点是必要的,因为他说
, 什么不足以写入输出缓冲区。 在没有足够空间的情况下
如果有足够的空间,返回它将写入的字节数。
在此处播放代码 ...
帅驴
赞同来自:
http://linux.die.net/man/3/asprintf
和 vasprintf, 这是为此而设计的。 他会发现如何为您突出显示内存并返回 null 任何内存分配错误。
asprintf 使正确的事情与行的分配相关 - 首先它测量尺寸,然后尝试分配使用 malloc. 否则他回来了 null. 如果您没有自己的内存分配系统,可以消除使用 malloc, asprintf 这是这项工作的最佳工具。
代码将如下所示:
</string.h></stdio.h></stdlib.h>
奔跑吧少年
赞同来自:
/和
构建包装函数/, 它会完成。
但
和
规定 POSIX, 根据 manpage, 后者可用于创建自己的简单版本。
和
.
您可以使用一些魔术预处理器,并仅在不支持它们的系统中使用您的功能。
莫问
赞同来自:
http://libslack.org/manpages/snprintf.3.html
-- 这为测量将获得的数据大小提供了一种简单的方法,以便您可以分配一个地方。
如果你
真的
你不能这样做,另一个机会是一个临时文件的印章
, 要获得大小,分配内存,然后使用 sprintf. 但
确实
这是首选方法。
董宝中
赞同来自:
http://library.gnome.org/devel ... rintf
, 这使得如果绑定到你想要的东西 GLib 这是一个选择。 从文档中:
类似于标准函数 C
, 但更安全,就像她一样
计算最大所需空间
并分配存储内存
结果。 返回线必须是
免费S.
, 什么时候不再
必要的。
董宝中
赞同来自:
open_memstream/3/ 至少可以使用 Linux 和 macOS 已经有几年了。 反向参数 open_memstream/3/ 是一个 fmemopen/3/, 这使得缓冲区的内容可访问。
如果你只需要一个 sprintf/3/, 然后广泛实施,但非标准 asprintf/3/ 也许是你需要的。
裸奔
赞同来自: