strncpy
не является ограниченным strcpy
. Это операция фиксированной длины (не ограниченной, фиксированной длины), нацеленная на назначение, которое является не строкой C (с нулевым символом в конце), а полем с нулевым заполнением , как то, что использовалось в определенных видах записи данных. таблицы в 70-х и начале 80-х годов. Он в основном не имеет современной цели и не должен использоваться, если вы действительно не хотите этого поведения.
snprintf
- каноническая функция C для «ограниченного strcpy
». В системах POSIX strnlen
+ memcpy
будет еще одной хорошей альтернативой, и она необходима, если вам нужно поддерживать строки длиннее INT_MAX
. Если у вас нет strnlen
, вы можете легко сделать это с помощью memchr
и сделать то же самое.
Обратите внимание, что простое использование snprintf
не является «ограниченным» в том смысле, что оно ограничено тем, сколько он читает из источника; он обязательно читает всю исходную строку, чтобы определить возвращаемое значение, которое может потребовать затрат времени и зависит от того, является ли источник допустимой (прекращенной) строкой. Если вы хотите, чтобы он был ограничен в смысле как источника, так и назначения, вы можете сделать что-то вроде:
snprintf(dest, n, "%.*s", (int)n-1, src);
Однако, это достаточно не идиоматично и подвержено ошибкам, поэтому я бы просто использовал strnlen
и memcpy
вместо.