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