Цитата(demiurg_spb @ Feb 26 2013, 15:48)

не известен его требуемый размер...
А чо™ — пробежаться по форматной строке в режиме dry-run :-), вычислить длину.
Потом по указателю на получатель уточнить у менеджера памяти
реальный размер выделенного блока (он может отличаться от того, который запрашивали в тех str_cpy() и, возможно, перезапрашивали в str_cat()), например, потому, что менеджер памяти округляет размер блока до 16 или 32 байт. Ну и тогда уже решать, лезет в тот же блок или нет, перезапрашивать новый. Ну и потом уже реально печатать. Всё можно, было бы желание.
Кстати, в str_printf там еще может быть морока, в задании оно печатает в ту же строку, из которой берёт. В случае формата "!%s!" оно начнёт налазить само на себя, нужен какой-от промежуточный буфер либо совсем новый, указатель на который потом записывать в первый аргумент. Так что не зря пока сказано, что str_printf делать не надо :-)
Но и для str_cpy и str_cat подобная беда будет, там всего лишь проще считать необходимую длину.