我正在玩 printf 和想法 编写一个调用普通 printf 的 my_printf(...) 以及将结果发送到特殊函数的 sprintf。 (我在考虑 sprintf,因为它在大多数平台上的行为就像 printf)。
我的想法是编写一个小宏来执行此操作:
#define my_printf(X, Y...) do{ printf(X, ## Y); \ char* data = malloc(strlen(X)*sizeof(char)); \ sprintf(data, X, ## Y); \ other_print(data);\ free(data);}while(0)
但是由于 sprintf 可以将字符串扩展到比 X 大得多的大小, 该方法几乎直接中断。
而且只是添加一个数字做 malloc 似乎是解决问题的错误方法, 从那时起,我就将问题转移到 future 和我想要打印一个大表达式的那一天......
有没有人对如何解决这个问题有更好的想法? 或者我怎么知道 sprintf 结果有多大?
谢谢 约翰
更新:我忘记了 printf 返回它打印的字符数, 因为我已经在宏中调用了 printf,所以很容易添加 保存数字的 int。
#define buf_printf(X, Y...) do{ int len = printf(X, ## Y); \ char* data = malloc((len+1)*sizeof(char)); \ sprintf(data, X, ## Y); \ other_print(data);\ free(data);}while(0)
更新:我正在考虑这个问题,也许可以使用一个普通函数 这看起来很像 ephemient 所建议的是个好主意。 关键似乎是不同 printf 函数的 v 版本 (vprintf、vsprintf 和 vsnprintf)。感谢您指出这一点。
再次感谢 约翰
最佳答案
使用snprintf计算大小。从手册页:
"如果输出由于此限制而被截断,则返回值是字符数(不包括尾随的 '\0'),如果有足够的可用空间,这些字符数将写入最终字符串 "
snprintf 是 C99 的标准。如果您只有 C89 编译器,请查看文档:准标准版本可能不会返回您想要的值。同样根据手册页,如果输出被截断,glibc 2.1 之前的版本通常会返回 -1,而不是所需的大小。
顺便说一句,sizeof(char) 在每个 C 实现中都被定义为 1,永远 :-)
关于创建一个将数据发送到 sprintf 和普通 printf 的 my_printf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/498705/