我正在考虑编写一个函数来估计至少来自sprintf(),snprintf()函数的格式化字符串的全长。
我的方法是解析格式字符串以找到各种%s,%d,%f,%p args,创建strlen()s,itoa()s和strlen(format_string)的运行总和保证足够大的东西为snprintf()分配适当的缓冲区。
我知道以下工作,但它需要10倍的时间,因为所有printf()函数都非常灵活,但非常慢,因为如果它。
char c;
int required_buffer_size = snprintf(&c, 1, "format string", args...);
这已经完成了吗? - 通过建议的方法,或其他一些合理有效的方法 - IE:比sprintf()变种快5-50倍?
答案 0 :(得分:5)
首先分配一个足够大的缓冲区并检查它是否足够长。如果没有重新分配并再次拨打电话。
int len = 200; /* Any number well chosen for the application to cover most cases */
int need;
char *buff = NULL;
do {
need = len+1;
buff = realloc(buff, need); /* I don't care for return value NULL */
len = snprintf(buff, need, "...", ....);
/* Error check for ret < 0 */
} while(len > need);
/* buff = realloc(buff, len+1); shrink memory block */
通过正确选择初始值,在大多数情况下,只有一次调用snprintf()
,并且过度分配的一点点不应该是关键的。如果您处于如此紧张的环境中,这种分配是至关重要的,那么您已经在昂贵的分配和格式化方面遇到了其他问题。
在任何情况下,您仍然可以在调用realloc()
之后将分配的缓冲区缩小到精确的大小。
答案 1 :(得分:1)
如果snprintf
的第一个参数是NULL
,则返回值是将要写入的字符数。