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

标签 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 倍?

最佳答案

首先分配一个足够大的缓冲区并检查它是否足够长。如果没有重新分配并再次调用。

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() 将分配的缓冲区缩小到准确的大小。

关于c - 估计格式化 snprintf() 字符串的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21863544/

相关文章:

c - 在C编程中提取一串字符和数字中的字符串数字

c - GCC 按位属性

c - 为什么我们需要文件描述符和文件指针

c - 使线程获得相等的时间片

c - 替换许多字符串常量的宏

c# - 在 C# 中使用委托(delegate)作为 C DllImported 函数的回调

无法删除(rm)c程序中的文件但可以在shell中

c - 即使定义了 %.o,也没有制作 something.o 的规则

c xml lib如何搜索我的节点

c - 函数指针比较