копирование строки c с помощью strncpy - PullRequest
2 голосов
/ 23 сентября 2011

Я очень разочарован функцией strncpy. Я сделал что-то вроде этого:

char *md5S; //which has been assign with values, its length is 44
char final[32];
strncpy(final,md5S,32);

но как-то длина char final[] стала больше 32 после. Что мне здесь делать?

Ответы [ 3 ]

9 голосов
/ 23 сентября 2011

Вы забыли оставить место для нулевого персонажа

char final[33];
strncpy(final,md5S,32);
final[32] = '\0';
5 голосов
/ 23 сентября 2011

strncpy не завершает NUL скопированную строку, если длина исходной строки равна или превышает n символов.Если у вас есть доступ к нему, вы можете использовать strlcpy, что для вас завершится NUL.

Сделайте это вместо:

strncpy(dst, src, dstlen - 1);
dst[dstlen - 1] = '\0';

ИЛИ

strlcpy(dst, src, dstlen);

где для массива символов: dstlen = sizeof(dst).

2 голосов
/ 23 сентября 2011

Если ваш выходной буфер недостаточно велик, чтобы скопировать всю исходную строку и завершающий NUL, тогда выходная строка не будет завершена NUL.

В вашем случае MD5 равен 33 байта, включаяNUL, поэтому NUL не копируется.Когда вы читаете строку назад, вы читаете за концом буфера.

Делайте последние 33 байта длиной, и ВСЕГДА добавляйте NUL к последнему символу в месте назначения при использовании strncpy.

int n = 32;
char *src = "some really really long, more than 32 chars, string."
char dst[n+1];

strncpy(dst, src, n);
dst[n] = '\0';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...