C 将va_参数传递给自定义格式函数
我想在自定义格式化程序函数中使用va_args列表 我首先尝试让vsnprintf()工作,以验证我的参数指针列表本身是否正确传递=>这工作正常 但是,当我试图将参数指针列表传递给另一个函数时,指针没有指向堆栈上的正确元素C 将va_参数传递给自定义格式函数,c,variadic-functions,C,Variadic Functions,我想在自定义格式化程序函数中使用va_args列表 我首先尝试让vsnprintf()工作,以验证我的参数指针列表本身是否正确传递=>这工作正常 但是,当我试图将参数指针列表传递给另一个函数时,指针没有指向堆栈上的正确元素 #include <stdio.h> #include <stdarg.h> int wrapper_snprintf(char *s, size_t n, const char *format, ...) { va_list arg; /
#include <stdio.h>
#include <stdarg.h>
int wrapper_snprintf(char *s, size_t n, const char *format, ...)
{
va_list arg;
//Copy Formated string to buffer => adds a terminating null character to the string
va_start(arg, format);
int res = vsnprintf(s, n, format, arg);
va_end(arg);
return res;
}
void Va_Args_Test_C(char *fmt, ...)
{
char test[30] = { 0 };
char test2[30] = { 0 };
{
//vsnprintf
va_list arg;
va_start(arg, fmt);
vsnprintf(test2, 30, fmt, arg);
va_end(arg);
}
{
//custom format function
va_list arg;
va_start(arg, fmt);
wrapper_snprintf(test2, 30, fmt, arg);
va_end(arg);
}
}
#包括
#包括
int wrapper\u snprintf(字符*s,大小\u t n,常量字符*格式,…)
{
va_列表参数;
//将格式化字符串复制到缓冲区=>将终止的空字符添加到字符串中
va_开始(参数,格式);
int res=vsnprintf(s,n,格式,arg);
va_端(arg);
返回res;
}
无效VAU参数测试(字符*fmt,…)
{
字符测试[30]={0};
char test2[30]={0};
{
//vsnprintf
va_列表参数;
va_启动(arg、fmt);
vsnprintf(测试2,30,fmt,arg);
va_端(arg);
}
{
//自定义格式函数
va_列表参数;
va_启动(arg、fmt);
包装纸(测试2,30,fmt,arg);
va_端(arg);
}
}
第一次成功了。将正确的参数复制到字符串测试[]
第二次运行不起作用。test2[]包含原始字符串+一些随机数(看起来像指向我的蹩脚指针)。你能帮我吗?我做错了什么?在第一种情况下,您调用
vsnprintf(test2,30,fmt,arg)代码>。
此函数定义为
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
在第二种情况下,调用wrapper\u snprintf(test2,30,fmt,arg)代码>,但您的定义不同,如
int wrapper_snprintf(char *s, size_t n, const char *format, ...)
这就好像您要调用snprintf
而不是vsnprintf
如果要替换vsnprintf
,则必须使用va_list
类型的参数来定义函数,而不是…
int wrapper_snprintf(char *s, size_t n, const char *format, va_list ap)
{
//Copy Formated string to buffer => adds a terminating null character to the string
int res = vsnprintf(s, n, format, ap);
return res;
}