vsprintf() 函数 和 vfprintf() 函数的原型为:
#include <stdio.h>
int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap); 这两个函数对应于 printf() 和 vprintf() 函数,其函数名前面都有 v 字符。在传递参数时,都需要传递 va_list 类型参数。
测试代码-1 :
#include <stdarg.h>
#include <stdlib.h>
FILE *printer;
FILE *logfile;
int xprintf(const char *format, ...)
{
va_list ap;
va_start(ap, format);
vprintf(format, ap);
if(printer)
vfprintf(printer, format, ap);
if(logfile)
vfprintf(logfile, format, ap);
va_end(ap);
}
/*
int old_xprintf(const char *format, long a1, long a2, long a3, long a4,
long a5, long a6, long a7, long a8)
{
printf(format,a1, a2, a3, a4, a5, a6, a7, a8);
if(printer)
fprintf(printer, format, a1, a2, a3, a4, a5, a6, a7, a8);
if(logfile)
fprintf(logfile, format, a1, a2, a3, a4, a5, a6, a7, a8);
}
*/
int main(void)
{
int a1 = 1, a2 = 2, a3 = 3, a4 = 4, a5 = 5, a6 = 6, a7 = 7, a8 = 8,
a9 = 9;
printer = fopen("test", "w+");
logfile = fopen("test2", "w+");
// old_xprintf("%d,%d,%d,%d,%d,%d,%d,%d\n", a1, a2, a3, a4, a5, a6, a7, a8);
xprintf("kkkkkkk%d,%d,%d\n", a1, a2,a4,a5);
fclose(printer);
fclose(logfile);
return 0;
} 运行及其输出:beyes@linux-beyes:~/C/base> ./vsprintf.exe
kkkkkkk1,2,4
beyes@linux-beyes:~/C/base> cat test
kkkkkkk1,2,4
beyes@linux-beyes:~/C/base> cat test2
kkkkkkk1,2,4 说明:
vp 对应于传递给 xprintf 函数中的 ... 号表示的参数列表。va_start() 这个宏会分析并展开这个参数列表。由于 xprintf 的第一个字符串参数中只指定了3个 %d ,那么在参数列表后即使指定了 4 个参数,那么最后一个参数 a5 会因为没有匹配项而没有输出。
假如修改 %d 的个数多于参数列表中的参数个数,那会怎么样呢?将上面程序中调用的 xprintf() 改为 xprintf("kkkkkkk%d,%d,%d\n", a1);
经编译运行输出为:beyes@linux-beyes:~/C/base> ./vsprintf.exe
kkkkkkk1,0,0 由输出可见,如果第一个字符串参数中的内置类型(%d,%c等)项数多于参数列表中的参数个数,那么在输出时,多出部分用 0 来表示。
另外,vfprintf() 函数和 vprintf() 不同在于 vprintf() 输出到标准输出中,而 vfprintf() 输出到文件流指针所指向的文件里。
关于 va_start() 这些宏见:http://www.groad.net/bbs/read.php?tid=947 |