Some small items, additional to the great review by Chux. * You don't seem to use anything from `<assert.h>` or `<float.h>`, so no need to include those. * The missing features are not documented anywhere, so we have to guess what subset of `printf()` is supported. * Test cases are missing for ±infinity and not-a-number values with the `%f` specifier and for null pointers with the `%s` specifier. * Precision specifiers don't work properly with `%s`: myprintf("%.5s", "abcdefg"); // crashes * Unnecessary obfuscation: `*(s_p+1)` is much more recognisable when written as `s_p[1]`. * The fallthrough from `case '.'` to `default` causes the second conversion specifier to be printed literally in this example (and could be even more serious if the second conversion were `%%`): myprintf("%.1f%f\n", 1.0, 0.0);