gpt4 book ai didi

c - printf 的包装器

转载 作者:行者123 更新时间:2023-12-03 22:32:15 26 4
gpt4 key购买 nike

我正在Arduino下编码,我想开发串行打印格式化功能,所以我尝试使用sprintf未知大小的缓冲区。基本上,我们可以避免谈论 Arduino 及其串行输出,而是考虑将文本写入缓冲区,然后使用 printf 打印它。 .我试过这个:

#include <stdio.h>
#include <stdarg.h>

void printf0( const char* format, ... ) {
va_list args;
va_start(args, format);
vprintf(format, args);
va_end( args );
}

void printf1(const char* format,...) {
va_list args;
va_start(args, format);
char buf[vsnprintf(NULL, 0, format, args)];
sprintf(buf, format, args);
printf(buf);
va_end(args);
}

int main()
{
printf0("Hello, %d!\n", 15);
printf1("Hello, %d!\n", 15);
return 0;
}
printf0函数是我找到的一个准确的例子 here .我的尝试是函数 printf1 ,这会产生不可预测的数字。上述程序的示例输出为:
Hello, 15!
Hello, 860799736!

最佳答案

argsva_list ,所以你不能调用sprintf用它。您必须使用 vsprintfvsnprintf :

sprintf(buf, format, args);

应该
vsnprintf(buf, sizeof buf, format, args);

此外,您应该在 buf 的大小上加 1对于字符串的 0 终止符:
char buf[vsnprintf(NULL, 0, format, args) + 1];

似乎第一次调用 vsnprintf变化 args ,所以你必须添加
va_end(args);
va_start(args, format);

两次通话之间:
http://ideone.com/5YI4Or

似乎第一次调用 vsnprintf变化 args ,但您不应调用 va_start两次。您应该使用 va_copy相反,所以添加
va_list args2;
va_copy(args2, args);

初始化后 args .也不要忘记调用 va_end(args2);也:

http://ideone.com/loTRNL

链接到 va_copy手册页: https://linux.die.net/man/3/va_copy

关于c - printf 的包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42131753/

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