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

frydsh 2009-12-16 08:17:04
问题描述如下(请不要讨论下面示例的合理性)

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

我想把foo中的可变的参数传递给printf,比如foo("%d",2),我希望printf那里的fmt之后传递的就是这个2.
现在,printf是个系统函数,不能修改它;其次,不要用vprintf这样的函数,也就是说限定使用printf。
大家有什么好的方法没有,谢谢
...全文
2127 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
herman~~ 2009-12-17
  • 打赏
  • 举报
回复
mark
kangming07 2009-12-17
  • 打赏
  • 举报
回复
没有这样试过,可以学习下
taodm 2009-12-17
  • 打赏
  • 举报
回复
楼主既然自己选择了这样的无聊束缚,那就无解啦。
selooloo 2009-12-17
  • 打赏
  • 举报
回复
只能把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其实是个字符型指针
frydsh 2009-12-16
  • 打赏
  • 举报
回复
问题已经说不能vsprintf了,再说不是所有的函数都接受va_list参数的
highball 2009-12-16
  • 打赏
  • 举报
回复
[Quote=引用 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;
}
[/Quote]
学习
jixingzhong 2009-12-16
  • 打赏
  • 举报
回复
直接传递 va_list 即可
太乙 2009-12-16
  • 打赏
  • 举报
回复
/* 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;
}

太乙 2009-12-16
  • 打赏
  • 举报
回复
/* 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;
}


太乙 2009-12-16
  • 打赏
  • 举报
回复
很简单,可以参考sprintf的实现

69,380

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧