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

use*_*100 1 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...);
Run Code Online (Sandbox Code Playgroud)

这已经完成了吗? - 通过建议的方法,或其他一些合理有效的方法 - IE:比sprintf()变体快5-50倍?

Pat*_*ter 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 */
Run Code Online (Sandbox Code Playgroud)

通过正确选择初始值,snprintf()在大多数情况下只需要一次调用,而过度分配的一点点不应该是关键的.如果您处于如此紧张的环境中,这种分配是至关重要的,那么您已经在昂贵的分配和格式化方面遇到了其他问题.在任何情况下,您仍然可以调用realloc()后来将分配的缓冲区缩小到确切的大小.