Я все еще использую printf, главным образом потому, что легко контролировать формат вывода.
Для меня безопасность типов не является здесь главным преимуществом, поскольку ее можно легко определить с помощью теста, учитывая тот факт, что консольную программу гораздо проще тестировать, чем приложения на основе пользовательского интерфейса или веб-приложения. Если вы не выполните тестирование, более серьезные ошибки могут пройти проверку времени компиляции любым способом.
Я также не согласен с другой причиной, по которой поток заявок является более гибким благодаря взаимозаменяемости. Это эквивалентно рекомендовать использовать fprintf (fout, ...) для взаимозаменяемости. Если вам нужно перенаправить вывод, используйте pipe. Если вы находитесь в библиотеке, почему бы вам просто не вернуть строку и позволить вызывающей стороне решить, куда она идет?