Зачем избавляться от strcpy? Она проста и эффективна, как и большая часть языка C. Проверка длинны строки на каждый символ или просто дополнительная проверка -- это проверка и, как следствие, затраченное время. При определённой культуре программирования, покрытия кода тестами (в том числе и со случайными данными), ревью, и использовании средств статического и динамического анализа, риски можно минимизировать. Взамен вы получаете быстрый и легкий код, практически без оверхеда. Из-за отсутствия оверхеда (тяжёлого рантайма), этот язык популярен для всяких системных вещей (я всё ещё скептически настроен насчёт Rust) + очень много кода на нём уже написано и его надо поддерживать + интерфейсы многих библиотек написаны на C из-за возможных проблем с ABI, в случае C++, например и т.п.
В C++ дела обстоят по-другому, и мешать (а тем более путать) его с C не стоит (ну только, если надо что-то системное дёрнуть в недрах вашего кода или написать обвязки для C библиотеки).