我正在考虑编写一个函数来估计至少来自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倍?
首先分配一个足够大的缓冲区并检查它是否足够长.如果没有重新分配并再次拨打电话.
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()后来将分配的缓冲区缩小到确切的大小.
| 归档时间: |
|
| 查看次数: |
777 次 |
| 最近记录: |