估计格式化的snprintf()字符串的大小?

时间:2014-02-18 19:30:47

标签: c

我正在考虑编写一个函数来估计至少来自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倍?

2 个答案:

答案 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,则返回值是将要写入的字符数。