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

标签 c linux gcc printf

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

相关文章:

objective-c - Objective C float 乘法产生意想不到的结果

linux - AMD GPU 无法在 Linux 上使用 Blender 的 "Cycles Render"

c++ - 使用非扩展 -std 编译时,-Wpedantic 会做任何事情吗?

mysql - 使用CronJob自动备份MySQL文件

linux - Shell 脚本 - 检查文件夹并删除该文件夹中超过一小时的文件

gcc - gcc 的 -pthread 和 -rdynamic 选项有什么意义?

c++ - 为什么 g++ 编译的代码会超出堆栈指针的范围?

java - 什么是非 unicode 应用程序

c - 打印出字符串数组

c - 从 C 函数返回链表结构