下面用两个例子说明C语言中可变参数的用法。
1. 实现mystrcat函数,扩增strcat函数的功能
mystrcat.c文件:
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
char * mystrcat(char *dest, char *fmt, ...)
{
char buf[1024];
va_list argptr;
va_start(argptr, fmt);
vsprintf(buf, fmt, argptr);
va_end(argptr);
return strcat(dest, buf);
}
void main()
{
char buf[1024];
sprintf(buf, "%s", "Hello World!");
printf("%s\n", buf);
mystrcat(buf, "%s", "This is a test.");
printf("%s\n", buf);
return;
}
编译运行:
# gcc -o mystrcat mystrcat.c# ./mystrcat
Hello World!
Hello World!This is a test.
2. 实现myprintf函数,一个简单的printf函数。
myprintf.c文件:
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
void myprintf(const char* fmt, ...)
{
int flag;
char cval;
int ival;
char* psval;
char buf[1024];
va_list arg_ptr;
const char* p;
if(0 == strlen(fmt))
return;
va_start(arg_ptr, fmt);
flag = 0;
p = fmt;
while(*p != '\0')
{
if('%' == *p && 0 == flag)
{
flag = 1;
}else if(1 == flag)
{
switch(*p)
{
case 'c':
cval = va_arg(arg_ptr,int); /* va_arg宏的第2个参数不能被指定为char、short或者float类型。因为在可变参数函数传递时,char和short类型的参数会被提升为int类型,float类型的参数会被提升为double类型。*/
putchar(cval);
break;
case 'd':
ival = va_arg(arg_ptr,int);
printf("%d", ival);
break;
case 's':
psval = va_arg(arg_ptr,char*);
puts(psval);
break;
default:
putchar('%');
putchar(*p);
}
flag = 0;
}else
{
putchar(*p);
}
p++;
}
va_end(arg_ptr);
return;
}
void main()
{
myprintf("%c%d%s\n", 'a', 9, "test");
return;
}
编译运行:
# gcc -o myprintf myprintf.c
# ./myprintf
a9test