Существует очень мало обоснованных случаев использования strncpy
. Это довольно опасная функция. Если длина исходной строки (без нулевого символа) равна размеру целевого буфера, то strncpy
не добавит нулевой символ в конец целевого буфера. Таким образом, буфер назначения не будет нулевым завершением.
Мы должны написать такой код для Linux:
lenSrc = strnlen(pSrc, destSize)
if (lenSrc < destSize)
memcpy(pDest, pSrc, lenSrc + 1);
else {
/* Handle error... */
}
В вашем случае, если вы хотите обрезать источник при копировании, но по-прежнему хотите конечный буфер с нулевым символом в конце, вы можете написать такой код:
destSize = 32
sizeCp = strnlen(pSrc, destSize - 1);
memcpy(pDest, pSrc, sizeCp);
pDest[sizeCp] = '\0';
Редактировать: О ... Если это не обязательно для завершения по NULL, strncpy
- это правильная функция для использования. И да, вам нужно назвать это с 32, а не 31.
Я думаю, что вы должны игнорировать это предупреждение, отключив его ... Честно говоря, у меня нет хорошего ответа на это ...
Edit2: чтобы имитировать функцию strncpy
, вы можете написать этот код:
destSize = 32
sizeCp = strnlen(pSrc, destSize - 1);
memcpy(pDest, pSrc, sizeCp + 1);