The C Programming Language, 2nd Edition, by Kernighan and Ritchie
Exercise 7.03 on page 156
Revise minprintf to handle more of the other facilities of printf .
Solution by Gregory Pietsch
/* Gregory Pietsch - K&R2 Exercise 7-3 - 2001-01-28 gkp@flash.net */ #include <stdarg.h> #include <stdio.h> /* minprintf: minimal printf with variable argument list */ void minprintf(char *fmt, ...) { va_list ap; char *p, *sval; int ival; double dval; unsigned uval; va_start(ap, fmt); /* make ap point to the first unnamed arg */ for (p = fmt; *p; p++) { if (*p != '%') { putchar(*p); continue; } switch (*++p) { case 'd': case 'i': ival = va_arg(ap, int); printf("%d", ival); break; case 'c': ival = va_arg(ap, int); putchar(ival); break; case 'u': uval = va_arg(ap, unsigned int); printf("%u", uval); break; case 'o': uval = va_arg(ap, unsigned int); printf("%o", uval); break; case 'x': uval = va_arg(ap, unsigned int); printf("%x", uval); break; case 'X': uval = va_arg(ap, unsigned int); printf("%X", uval); break; case 'e': dval = va_arg(ap, double); printf("%e", dval); break; case 'f': dval = va_arg(ap, double); printf("%f", dval); break; case 'g': dval = va_arg(ap, double); printf("%g", dval); break; case 's': for (sval = va_arg(ap, char *); *sval; sval++) putchar(*sval); break; default: putchar(*p); break; } } va_end(ap); } /* end of function */










