下面用两个例子说明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.c2. 实现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