|
, 關鍵是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); } } } |