关于可变参数的代码实现:
/* 可变参数需要包含一个头文件 :stdarg.h */
#include<stdarg.h>
#include<stdio.h>
#include<stdlib.h>
/* ... 代表可变参数 */
void myprintf(char *ptstr,...)
{
/*va_list定义: typedef char * va_list;*/
va_list ap; //起始点
va_start(ap, ptstr); //从ap开始读取ptstr
char flag;
while (*ptstr) // \0 的值是 0 所以可以这样写
{
flag = *ptstr; //取出字符
if (*ptstr != '%')
{
putchar(flag); //打印字符
}
else
{
/* 如果遇到 % 字符则继续向前读取一个字符 */
ptstr++; //可能遇到 %d %c %s %% 分几种情况区别对代
flag = *ptstr;
switch (flag)
{
case 'd':
{
int data = va_arg(ap, int); //读取下一个参数按照int
printf("%d", data);
break;
}
case 'c':
{
char ch = va_arg(ap, char); //读取下一个参数按照char
printf("%c", ch);
break;
}
case 'f':
{
float f = va_arg(ap, float); //读取下一个参数按照 float
printf("%f", f);
break;
}
case 's':
{
char *str = va_arg(ap, char *); //读取下一个参数按照char *
printf("%s", str);
break;
}
case '%':
break;
}
}
ptstr++;
}
va_end(ap); //结束读取
}
void main()
{
printf("printf: 123abc\n");
myprintf("myprintf: 123abc\n");
printf("printf: 123abc%d\n", 10);
myprintf("myprintf: 123abc%d\n", 10);
printf("123abc%d%s\n", 10,"sadfsdf");
system("pause");
}