[求教]怎么写类似printf这类任意长度参数的函数?
rt,请教. 问题点数:0、回复次数:5Top
1 楼freefalcon(心宇—消失中...)回复于 2004-11-04 13:56:56 得分 0
ft, 不要一下发两遍,除非你确定这个问题很难
#include "stdio.h"
#include "stdarg.h"
void myprintf(const char* fmt, ...)
{
va_list va;
va_start(va, fmt);
printf("in myprintf\n");
#if 1
int i = va_arg( va, int); // 获得单个参数
printf("%d\n", i);
const char* s = va_arg( va, const char*);
printf("%s\n", s);
float f = va_arg(va, double);
printf("%f\n", f);
#else
vprintf(fmt, va); // 使用整个可变参数列表
#endif
va_end(va);
}
int main(int argc, char* argv[])
{
myprintf("%d\n%s\n%f\n", 1234, "hi", 3.14);
return 0;
}Top
2 楼titilima(李马 - www.titilima.cn)回复于 2004-11-04 13:57:27 得分 0
首先你需要一个接收va_list类型参数的函数,然后借助这个函数来完成。以printf为例:
int printf(char * szBuffer, const char * szFormat, ...)
{
int iReturn;
va_list pArgs;
va_start(pArgs, szFormat);
iReturn = vprintf(szFormat, pArgs);
va_end (pArgs);
return iReturn;
}Top
3 楼xu123(剑煮酒无味,饮一杯为谁)回复于 2004-11-04 14:27:06 得分 0
学习...Top
4 楼kunpengzhi(学思)回复于 2004-11-04 14:43:23 得分 0
建议看一下K&R的《The C Programming Language》中的相关描述,个人认为,讲解很到位Top
5 楼limlzm(凡叶)回复于 2004-11-04 15:45:41 得分 0
void foo(char *fmt, ...)
{
va_list ap;
int d;
char c, *p, *s;
va_start(ap, fmt);
while (*fmt)
switch (*fmt++) {
case 's': /* string */
s = va_arg(ap, char *);
printf("string %s\n", s);
break;
case 'd': /* int */
d = va_arg(ap, int);
printf("int %d\n", d);
break;
case 'c': /* char */
c = va_arg(ap, char);
printf("char %c\n", c);
break;
}
va_end(ap);
}Top




