Массив dest
не содержит строку, так как недостаточно места для размещения завершающего нуля '\0'
скопированной исходной строки,
Поэтому для вывода массива используйте следующую инструкцию
printf("strncpy: %*.*s\n", n, n, strncpy(dest, src, n));
В противном случае вы должны написать что-то вроде следующего
strncpy( dest, src, n )[sizeof( dest ) - 1] = '\0';
printf("strncpy: %s\n", dest );
В этом случае массив назначения не будет иметь последний символ строки источника, который будет перезаписан нулевым символом.
Если вы хотите скопировать меньше символов, чем размер целевого массива, то что делать после копирования, зависит от намерения. Если вы хотите просто перезаписать часть строки, которая уже сохранена в целевом массиве, вам больше ничего не нужно делать. В противном случае установите символ в позиции n
равным нулю.
Вот демонстрационная программа.
#include <stdio.h>
#include <string.h>
int main(void)
{
char src[] = "123456789A";
char dest[10] = "543216789";
size_t n = 5;
strncpy( dest, src, n );
printf("strncpy: %s\n", dest );
strncpy( dest, "Hello", n )[n] = '\0';
printf("strncpy: %s\n", dest );
return 0;
}
Его вывод
strncpy: 123456789
strncpy: Hello