gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:47:08 25 4
gpt4 key购买 nike

我正在玩 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com