可变参数函数的实现:
1、 #include <stdarg.h> //使用 va_list va_start 等必须包含的头文件;
2、void va_start(va_list ap, last);//va_start用于获取函数参数列表中可变参数的首指针(获取函数可变参数列表),根据fmt将fmt后面的具体参数让args指向;
3、type va_arg(va_list ap, type);//关键函数:va_arg用于获取当前args所指的fmt后面的具体可变参数,并将并将args指针移向下一可变参数
void va_end(va_list ap);//有va_start,当然也有va_end
具体实现一个my_printf函数代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h> //使用 va_list va_start 等必须包含的头文件
//还的手写itoa
char *itoa(int i, char* str)
{
sprintf(str, "%d", i);
return str;
}
void my_printf(const char *fmt, ...)
{
char str[100];
unsigned int len, i, index;
int iTemp;
char *strTemp;
va_list args;//可变参数函数的格式化的list
va_start(args, fmt);
len = strlen(fmt);
for(i = 0, index = 0; i < len; i++)
{
if(fmt[i] != '%')
{
str[index++] = fmt[i];
}
else
{
switch(fmt[i+1])
{
case 'd':
case 'D':
iTemp = va_arg(args, int);//关键函数:va_arg用于获取当前args所指的可变参数并将并将args指针移向下一可变参数
strTemp = itoa(iTemp, str+index);
index += strlen(strTemp);
i++;
break;
case 's':
case 'S':
strTemp = va_arg(args, char*);
strcpy(str+index, strTemp);
index += strlen(strTemp);
i++;
break;
default:
str[index++] = fmt[i];
}
}
}
str[index] = '\0';
va_end(args);//有va_start,当然也有va_end
printf("%s", str);
return ;
}
int main(int argc, char* argv[])
{
my_printf("%s-%d-%d-%s\n", "ceshi", 10, 2, "cehsi2");
return 0;
}