#include #include #include /* ...: Funktion hat variable Anzahl von Argumenten. */ void Printf(char const* fmt, ...) { /* Initialisierung zum Zugriff auf diese Argumente. */ va_list ap; /* Zweites Argument von va_start muss letzter fester Parameter sein. */ va_start(ap, fmt); while (*fmt != '\0') { if (*fmt == '%') { switch (*++fmt) { case '%': goto char_out; case 'c': { /* va_arg() holt nächstes variadisches Argument. Typ muss dem des * übergebenen Arguments entsprechen, sonst ist das Verhalten * undefiniert. Es findet keine Prüfung (weder beim Übersetzen noch * beim Ausführen) statt. * int, nicht char: Ganzzahltypen werden als variadischer Parameter * mindestens als int übergeben. Ebenso float als double. */ char c = va_arg(ap, int); putchar(c); break; } case 's': { char const* s = va_arg(ap, char const*); while (*s != '\0') putchar(*s++); break; } case 'u': { unsigned u = va_arg(ap, unsigned); /* Zahl von kleinster Stelle ab in den Puffer schreiben und dann * Puffer rückwärts ausgeben. */ char buf[10]; char* b = buf; do { *b++ = '0' + u % 10; u /= 10; } while (u != 0); while (b != buf) putchar(*--b); break; } default: abort(); } } else { char_out: putchar(*fmt); } ++fmt; } va_end(ap); } int main(void) { Printf("Hallo %% %s%c %u\n", "Welt", '!', 17); }