как правильно использовать strncpy?
Когда код должен скопировать строку в место назначения и допустить, что результат не является нулевым символом завершен и не полностью скопирован, используйте sizeof destination
для аргумента размера:
char a[10];
// strncpy(a,p,strlen(p));
strncpy(a, p, sizeof a);
// printf("%s\n", a);
printf("%.*s\n", (int) sizeof a, a);
Если код хочет скопировать строку и обнаружить недостаточные проблемы с памятью с помощью strncpy()
или если требуется заполнение нулевым символом '\0'
, также используйте sizeof destination
.
char a[10];
strncpy(a, p, sizeof a);
if (a[sizeof a - 1] != '\0') {
// insufficient memory
// Maybe set last last character to the null character
a[sizeof a - 1] == '\0';
// or other more robust handling
return ERROR_INSUFFICIENT_MEMORY;
}
В противном случае не используйте strncpy()
Существуют более эффективные способы обнаружения недостаточного объема памяти, чем с помощью strncpy()
, когда заполнение нулевым символом '\0'
не требуется. strncpy()
ноль заполняет остаток, если таковой имеется, не скопированного буфера. Ниже приведено много времени для заполнения нуля только для проверки недостаточности.
char a[1000];
strncpy(a, "abc", sizeof a);
if (a[sizeof a - 1] != '\0') {
....
Лучшие альтернативы используют strlen(), strlcpy(), memcpy()
. @Deduplicator.
См. Также strncpy или strlcpy в моем случае .
Для стандартного однострочного C lib код может использовать snprintf()
и строку обнаружения ошибок. Хороший компилятор должен был бы анализировать snprintf(a, sizeof a, "%s", p)
и генерировать эффективный код.
// Copy with no overflow.
// 'a' is always null character terminated.
int len = snprintf(a, sizeof a, "%s", p);
if (len < 0 || (unsigned) len >= sizeof a) Report_truncated_copy();