我正在寻找一个类似sprintf()
的函数实现,它可以自动分配所需的内存。
char *my_str = dynamic_sprintf("Hello %s, this is a %.*s nice %05d 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;
}
但是,当调用带有空指针的sprintf()
时,这会立即导致segfault。
那么有什么想法、解决方案或提示吗?一个类似sprintf()
的解析器的小实现放在公共领域就已经足够了,然后我就可以自己完成了。
多谢了!
8条答案
按热度按时间ct2axkht1#
下面是from Stack Overflow的原始答案。正如其他人提到的,您需要
snprintf
而不是sprintf
。确保snprintf
的第二个参数是zero
。这将防止snprintf
写入作为第一个参数的NULL
字符串。第二个参数是必需的,因为它告诉
snprintf
没有足够的空间写入输出缓冲区,当没有足够的空间时,snprintf
返回如果有足够的空间,它应该写入的字节数。正在从该链接复制代码...
3qpi33ja2#
GNU和BSD的asprintf和
vasprintf
就是为你设计的。它会为你计算出如何分配内存,并在任何内存分配错误时返回null。asprintf
在分配字符串方面做了正确的事情--它首先测量大小,然后尝试使用malloc
进行分配。如果失败,它将返回null。除非您自己的内存分配系统不允许使用malloc
,否则asprintf
是完成这项工作的最佳工具。代码如下所示:
wqlqzqxt3#
如果您可以使用GNU/BSD扩展,那么这个问题已经得到了解答,您可以使用
asprintf()
(和vasprintf()
构建 Package 器函数)并完成任务。但是根据手册页,
snprintf()
和vsnprintf()
是由POSIX强制要求的,后者可以用来构建您自己的asprintf()
和vasprintf()
的简单版本。您可以使用一些预处理器魔法,仅在不支持您的函数版本的系统上使用它们。
qjp7pelc4#
1.如果可能的话,使用
snprintf
--它提供了一种简单的方法来测量将要产生的数据大小,以便分配空间。1.如果您真的不能这样做,另一种可能性是使用
fprintf
打印到一个临时文件,以获得大小,分配内存,然后使用sprintf。tpxzln5u5#
GLib库提供了一个
g_strdup_printf
函数,如果可以选择与GLib链接,该函数可以完全满足您的需要。类似于标准的C
sprintf()
函数,但更安全,因为它计算所需的最大空间并分配内存来保存结果。当不再需要返回的字符串时,应使用g_free()
释放该字符串。rnmwe5a26#
POSIX. 1(又称IEEE 1003. 1 -2008)提供了开放内存流:
open_memstream(3)至少可以在Linux和macOS上使用,并且已经使用了很多年。open_memstream(3)的匡威是fmemopen(3),它可以阅读缓冲区的内容。
如果您只需要一个sprintf(3),那么广泛实现但非标准的asprintf(3)可能就是您想要的。
sf6xfgos7#
kuuvgm7e8#
我的https://stackoverflow.com/a/10388547/666907版本(v3)-更通用一点[注意我是C++新手,使用风险自担:P]: