> почерпнутое из безусловно полезной книжки ВиртаНе читал, осуждаю.
> где про strncpy() сказано
На заборе тоже... сказано.
> Функция ничего не знает про "буфер", а гарантирует, что в массиве будет размещено n символов.
Наконец-то! Именно об этом мы и говорим. На входе валидная строка, на выходе не строка. Тут-то мы и возвращаемся к тому, что нормальных функций работы со строками в стандартной библиотеке нет, и более-менее можно вменяемо использовать лишь snprintf и Annex K, но snprintf надо уметь готовить, а Annex K, решая одни проблемы, создает новые.
> надо понять и указать количество ненулевых символов источника + 1
Если мне заранее известна длина строки, я сделаю memcpy(). Мы говорим о случае, когда я не знаю, влезет ли строка в буфер и хочу получить две вещи: 1) обрезанную или нет, но валидную (то есть, нуль-терминированную) сишную строку в буфере; 2) информацию о том, обрезалась ли строка. Функция strncpy() не справляется ни с тем, ни с другим.
> Ну и хорошо бы ещё понять (мне) кто и зачем таким образом инициализирует массив.
Таким - говнокодеры. В любом серьезном проекте на си первым делом пишется своя, не сломанная реализация strcpy(), и всего остального семейства заодно.