==========================================================
变参函数:
- 头文件
#include <stdarg.h> - 涉及函数:
void va_start(va_list ap, last); //将指针ap指向last
type va_arg(va_list ap, type); //返回当前ap指针指向的值,然后指向下一个可变参数
void va_end(va_list ap); //将指针赋值为NULL
void va_copy(va_list dest, va_list src) //拷贝指针ap
demo:
File Name: 1.变参函数.c
Author: xiening
Mail: [email protected]
Created Time: 2019年11月26日 星期二 11时32分06秒
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
void func(char *format, ...)
{
va_list ap;
va_start(ap, format);
while(*format)
{
char *tem = strchr(format, '%');
char *tem1 = malloc(10);
char tem2;
if(NULL == tem)
goto dest;
if(tem == format)
{
switch(*(tem+1))
{
case 's':
printf("%s", va_arg(ap, char*));break;
case 'd':
printf("%d", va_arg(ap, int));break;
case 'c':
printf("%c", (char)va_arg(ap, int));break;
}
format = tem +2;
}
else if(1 == (tem-format))
{
memcpy(&tem2, format, 1);
switch(*(tem+1))
{
case 's':
printf("%c%s", tem2, va_arg(ap, char*));break;
case 'd':
printf("%c%d", tem2, va_arg(ap, int));break;
case 'c':
printf("%c%c", tem2, (char)va_arg(ap, int));break;
}
format = tem + 2;
}
else
{
strncpy(tem1, format, (tem-format));
switch(*(tem+1))
{
case 's':
printf("%s%s", tem1, va_arg(ap, char*));break;
case 'd':
printf("%s%d", tem1, va_arg(ap, int));break;
case 'c':
printf("%s%c", tem1, (char)va_arg(ap, int));break;
default:
tem1 = "";
}
format = tem + 2;
}
}
dest:
if(NULL != format)
printf("%s", format);
va_end(ap);
}
int main(int argc, char const *argv[])
{
func("SimpleInfo:%s-%d\n", "xiening", 12356);
return 0 ;
}