将 va_args 传递给自定义格式函数
passing va_args to a custom format function
我想在自定义格式化程序函数中使用 va_args 列表。
我首先尝试让 vsnprintf() 工作以验证我的参数指针列表本身是否已正确传递 => 这有效
但是当我试图将我的参数指针列表传递给另一个函数时,指针没有指向堆栈上的正确元素
#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);
}
}
第一个 运行 成功了。正确的参数被复制到字符串 test[].
第二个运行没有用。 test2[] 包含原始字符串 + 一些随机数(对我来说这看起来像是一个蹩脚的指针)。那你能帮我吗?我做错了什么?
在第一种情况下,您调用 vsnprintf(test2, 30, fmt, arg);
。
这个函数定义为
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
在第二种情况下你调用 wrapper_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;
}
我想在自定义格式化程序函数中使用 va_args 列表。
我首先尝试让 vsnprintf() 工作以验证我的参数指针列表本身是否已正确传递 => 这有效
但是当我试图将我的参数指针列表传递给另一个函数时,指针没有指向堆栈上的正确元素
#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);
}
}
第一个 运行 成功了。正确的参数被复制到字符串 test[].
第二个运行没有用。 test2[] 包含原始字符串 + 一些随机数(对我来说这看起来像是一个蹩脚的指针)。那你能帮我吗?我做错了什么?
在第一种情况下,您调用 vsnprintf(test2, 30, fmt, arg);
。
这个函数定义为
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
在第二种情况下你调用 wrapper_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;
}