Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将va_参数传递给自定义格式函数_C_Variadic Functions - Fatal编程技术网

C 将va_参数传递给自定义格式函数

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; /

我想在自定义格式化程序函数中使用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);

    }


}
#包括
#包括
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;
}