如何在一个可变参数函数中调用另一个可变参数函数

时间:2022-09-30 23:25:07
问题描述如下(请不要讨论下面示例的合理性)

void foo(char *fmt,...)
{
   printf(fmt,(问题在这里));
}

我想把foo中的可变的参数传递给printf,比如foo("%d",2),我希望printf那里的fmt之后传递的就是这个2.
现在,printf是个系统函数,不能修改它;其次,不要用vprintf这样的函数,也就是说限定使用printf。
大家有什么好的方法没有,谢谢

10 个解决方案

#1


很简单,可以参考sprintf的实现

#2


/* vsprintf example */
#include <stdio.h>
#include <stdarg.h>

void PrintFError (char * format, ...)
{
  char buffer[256];
  va_list args;
  va_start (args, format);
  vsprintf (buffer,format, args);
  perror (buffer);
  va_end (args);
}

int main ()
{
   FILE * pFile;
   char szFileName[]="myfile.txt";
   int firstchar = (int) '#';

   pFile = fopen (szFileName,"r");
   if (pFile == NULL)
     PrintFError ("Error opening '%s'",szFileName);
   else
   {
     // file successfully open
     fclose (pFile);
   }
   return 0;
}

 

#3


/* vprintf example */
#include <stdio.h>
#include <stdarg.h>

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

int main ()
{
   WriteFormatted ("Call with %d variable argument.\n",1);
   WriteFormatted ("Call with %d variable %s.\n",2,"arguments");

   return 0;
}
 

#4


直接传递 va_list  即可

#5


引用 3 楼 hqin6 的回复:
C/C++ code/* vprintf example*/
#include<stdio.h>
#include<stdarg.h>void WriteFormatted (char* format, ...)
{
  va_list args;
  va_start (args, format);
  vprintf (format, args);
  va_end (args);
}int main ()
{
   WriteFormatted ("Call with %d variable argument.\n",1);
   WriteFormatted ("Call with %d variable %s.\n",2,"arguments");return0;
}

学习

#6


问题已经说不能vsprintf了,再说不是所有的函数都接受va_list参数的

#7


mark

#8


只能把va_list解析出来再用,这个函数的功能应该和vsprintf功能一样
下面是个简单的例子

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

void foo(char *fmt,...) 

  char *p=fmt;
  va_list arg_ptr;
  int i,j,k;
  va_start(arg_ptr,fmt);
  i=va_arg(arg_ptr,int);
  j=va_arg(arg_ptr,int);
  k=va_arg(arg_ptr,int);
  va_end(arg_ptr);
  printf(fmt,i,j,k);


int main(void)
{
    int n=321; 
    foo("%d %d %d\n",n+1,n+2,n+4);
    getchar();
    return 0;
}


这里va_start,va_arg都是预编译,va_list其实是个字符型指针

#9


楼主既然自己选择了这样的无聊束缚,那就无解啦。

#10


没有这样试过,可以学习下

#1


很简单,可以参考sprintf的实现

#2


/* vsprintf example */
#include <stdio.h>
#include <stdarg.h>

void PrintFError (char * format, ...)
{
  char buffer[256];
  va_list args;
  va_start (args, format);
  vsprintf (buffer,format, args);
  perror (buffer);
  va_end (args);
}

int main ()
{
   FILE * pFile;
   char szFileName[]="myfile.txt";
   int firstchar = (int) '#';

   pFile = fopen (szFileName,"r");
   if (pFile == NULL)
     PrintFError ("Error opening '%s'",szFileName);
   else
   {
     // file successfully open
     fclose (pFile);
   }
   return 0;
}

 

#3


/* vprintf example */
#include <stdio.h>
#include <stdarg.h>

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

int main ()
{
   WriteFormatted ("Call with %d variable argument.\n",1);
   WriteFormatted ("Call with %d variable %s.\n",2,"arguments");

   return 0;
}
 

#4


直接传递 va_list  即可

#5


引用 3 楼 hqin6 的回复:
C/C++ code/* vprintf example*/
#include<stdio.h>
#include<stdarg.h>void WriteFormatted (char* format, ...)
{
  va_list args;
  va_start (args, format);
  vprintf (format, args);
  va_end (args);
}int main ()
{
   WriteFormatted ("Call with %d variable argument.\n",1);
   WriteFormatted ("Call with %d variable %s.\n",2,"arguments");return0;
}

学习

#6


问题已经说不能vsprintf了,再说不是所有的函数都接受va_list参数的

#7


mark

#8


只能把va_list解析出来再用,这个函数的功能应该和vsprintf功能一样
下面是个简单的例子

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

void foo(char *fmt,...) 

  char *p=fmt;
  va_list arg_ptr;
  int i,j,k;
  va_start(arg_ptr,fmt);
  i=va_arg(arg_ptr,int);
  j=va_arg(arg_ptr,int);
  k=va_arg(arg_ptr,int);
  va_end(arg_ptr);
  printf(fmt,i,j,k);


int main(void)
{
    int n=321; 
    foo("%d %d %d\n",n+1,n+2,n+4);
    getchar();
    return 0;
}


这里va_start,va_arg都是预编译,va_list其实是个字符型指针

#9


楼主既然自己选择了这样的无聊束缚,那就无解啦。

#10


没有这样试过,可以学习下