加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

创建一个my_printf,将数据发送到sprintf和普通的printf?

发布时间:2020-12-16 10:44:48 所属栏目:百科 来源:网络整理
导读:我正在玩printf和想法 写一个调用普通printf的my_printf(…) 以及将结果发送到特殊功能的sprintf. (我在考虑sprintf,因为在大多数平台上它的行为与printf一样). 我的想法是编写一个执行此操作的小宏: #define my_printf(X,Y...) do{ printf(X,## Y); char
我正在玩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似乎是解决问题的错误方法,
从那以后我就把这个问题带到了未来,有一天我想要打印一个大表达…

有没有人对如何解决这个问题有更好的想法?
或者我怎么知道sprintf结果会有多大?

谢谢
约翰

更新:我忘记了printf返回打印的字符数,
因为我已经在宏中调用printf,所以添加它是一件非常容易的事情
保存数字的int.

#define buf_printf(X,Y...) do{ int len = printf(X,## Y); 
    char* data = malloc((len+1)*sizeof(char)); 
    sprintf(data,## Y); 
    other_print(data);
    free(data);}while(0)

更新:我正在考虑这个,也许是使用正常的功能
看起来很像ephemient提出的是一个好主意.
关键似乎是不同printf函数的v版本
(vprintf,vsprintf和vsnprintf).感谢您指出了这一点.

再次感谢
约翰

解决方法

最好的方法是使用varargs.使用与printf()相同的原型创建一个函数,并使用varargs函数将数据传递给sprintf以填充所需的缓冲区,并在返回之前将该缓冲区传递给printf(“%s”).

许多早期的实现对最低级别的printf()调用有4K限制,但我会选择更多.您可能需要设置一个上限并坚持下去.

我们在日志记录系统中使用的一个技巧是使用printf()将数据写入/ dev / null句柄.由于printf()返回写入的字符数,因此我们使用它来分配缓冲区.但这不是很有效,因为它涉及调用printf() – 类型函数两次.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读