#include <stdio.h>
#include <string.h>
#include <stdarg.h>

void my_printf(const char *fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    char c;
    while ((c =  *fmt++) != '\0') {
        if (c == '%') {
            if ((c = *fmt++) == '\0') {
                break;
            }
            switch(c) {
                case 's': {
                    const char *s = va_arg(ap, const char *);
                    fwrite(s, 1, strlen(s), stdout);
                    break;
                }
                case 'c': {
                    const char x = (char) va_arg(ap, int);
                    putchar(x);
                    break;
                }
                case '%':
                    putchar('%');
                    break;
                case 'x': /* ... */; break;
                case 'z': /* ... */; break;
                default: putchar(c); break;
            }
        } else {
            putchar(c);
        }
    }
    va_end(ap);
}

int main(void)
{
    my_printf("%s%c", "Hello, world", '\n');
}