一般认为 这两个函数要比 strcpy strcat 安全。 实则不然, 对于 strncpy , 有丢失 字符串结束符 '\0' 的风险。 对于 strncat , 则会有 dest 溢出的风险。
对于 strncat ,做了实验:
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
char dest[10] = {0};
char *src = "0123456789abcd";
strncat(dest, src, 14);
printf("dest is %s\n", (char*)dest);
return 0;
}
实际上, 此时 dest 已经溢出, 但未报出任何异常,这就是定时炸弹。 所以在使用 strncat 的时候,要判断 n 个字符是否能被 dest 容纳下, 并且 还要预留一个 结束符的位置, 即 n-1