我正在使用 printf 和编写调用普通 printf 的 my_printf(...) 和将结果发送到特殊函数的 sprintf 的想法。(我在考虑 sprintf 因为它在大多数平台上的行为就像 printf 一样)。
我的想法是写一个小宏来做到这一点:
#define my_printf(X, Y...) do{ printf(X, ## Y); \ char* 数据 = malloc(strlen(X)*sizeof(char)); \ sprintf(数据,X,##Y);\ 其他打印(数据);\ 免费(数据);}同时(0)
但是由于 sprintf 可以将字符串扩展为比 X 大得多的大小,因此该方法几乎直接中断。
而且只是添加一个数字做 malloc 似乎是解决问题的错误方法,从那时起我就把问题移到未来和我想要打印一个大表达式的一天......
有没有人对如何解决这个问题有更好的想法?或者我怎么知道 sprintf 结果有多大?
谢谢约翰
更新:我忘记了 printf 返回它打印多少个字符,并且由于我已经在宏中调用 printf ,因此添加一个保存数字的 int 是一件非常容易的事情。
#define buf_printf(X, Y...) do{ int len = printf(X, ## Y); \ char* 数据 = malloc((len+1)*sizeof(char)); \ sprintf(数据,X,##Y);\ 其他打印(数据);\ 免费(数据);}同时(0)
更新:我正在考虑这个问题,也许使用一个看起来很像 ehemient 建议的正常功能是个好主意。那里的关键似乎是不同 printf 函数(vprintf、vsprintf 和 vsnprintf)的 v 版本。感谢您指出了这一点。
再次感谢约翰