关键是stdarg.h中的几个宏:va_start、va_arg和va_end,下面是一个简化版本的printf(),请参考:
#include "stdio.h"
#include "stdarg.h"
int printf (const char *format, ...)
{
static const char hex[] = "0123456789ABCDEF";
char format_flag;
unsigned int u_val, div_val, base;
char *ptr;
va_list ap;
va_start (ap, format);
for (;;) /* Until full format string read */
{
while ((format_flag = *format++) != ‘%‘) /* Until ‘%‘ or ‘\0‘ */
{
if (!format_flag)
{
va_end (ap);
return (0);
}
putchar (format_flag);
}
switch (format_flag = *format++)
{
case ‘c‘:
format_flag = va_arg(ap, int);
default:
putchar (format_flag);
continue;
case ‘s‘:
ptr = va_arg(ap,char *);
while (format_flag = *ptr++)
{
putchar (format_flag);
}
continue;
case ‘o‘:
base = 8;
if (sizeof(int) == 2)
div_val = 0x8000;
else
div_val = 0xC0000000;
goto CONVERSION_LOOP;
case ‘d‘:
base = 10;
if (sizeof(int) == 2)
div_val = 10000;
else
div_val = 1000000000;
goto CONVERSION_LOOP;
case ‘x‘:
base = 16;
if (sizeof(int) == 2)
div_val = 0x1000;
else
div_val = 0x10000000;
CONVERSION_LOOP:
u_val = va_arg(ap,int);
if (format_flag == ‘d‘)
{
if (((int)u_val) < 0)
{
u_val = - u_val;
putchar (‘-‘);
}
while (div_val > 1 && div_val > u_val)
{
div_val /= 10;
}
}
do
{
putchar (hex[u_val / div_val]);
u_val %= div_val;
div_val /= base;
}
while (div_val);
}
}
}
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。