通过函数原型可以看出printf函数其实是一个可变参数函数,在printf函数中只需要知道传入函数的第一个参数,就可以根据该参数在栈中的存储位置获取后面参数的位置及信息了。
printf函数第一个参数const cahr *format,该字符串内包含并确定了后面参数的输出格式,比如"%c","%d","%d","%x"等等。
printf函数返回值,就是通过该函数打印到标准输出流(屏幕)的字符串,出错的话就返回一个负数。
下面自己模拟一下printf函数来感受感受。
基本思路是:利用传入的第一个参数,也就是字符串。通过对字符串的遍历,若该字符为‘%’,则对它后面的字符进行判断是否是规范化输出要求的字符(比如'c','d','s',‘f’'等等),然后利用va_arg(ap,t);获取后面参数中参数所对应的信息,并输出;若不为'%',则输出该字符。同时在上述两种情况下,都需要对所打印的字符个数进行统计(包括输出数值所对应的数字的个数)。
#include <stdio.h>
#include <windows.h>
#include <assert.h>
int myprintf(const char *format, ...)
{
assert(format);
va_list arg;
va_start(arg, format);
while (*format)
{
if (*format == '%')
{
format++;
switch (*format)
{
case's':
{
char *s = va_arg(arg,char*);
while (*s)
{
puts(s);
}
}
break;
case'c':
{
char c = va_arg(arg, char);
putchar(c);
}
break;
case'%':
{
putchar('%');
}
break;
default:
puts("format error!\n");
return ;
}
}
else if (*format == '\\')
{
}
else
{
putchar(*format);
}
format++;
}
va_end(arg);
return 0;
}
int main()
{
char c = 'c';
char *s = "hello word";
myprintf("hello %c,hello %s\n", c, s);
system("pause");
return 0;
}