VC下的测试结果:
int _tmain(int argc, _TCHAR* argv[])
{
char src[] = "1234567890";
char dst[5];
//strcpy(dst, src); //越界
//strcpy_s(dst, 5, src); //缓冲区太小,程序异常退出
//strncpy_s(dst, 5, src, 10); //缓冲区太小,程序异常退出
//strncpy_s(dst, 5, src, 5); //缓冲区太小,程序异常退出
//strncpy_s(dst, 5, src, 4); //字符串截断,末尾自动补上null,输出1234
strncpy_s(dst, 5, src, _TRUNCATE); //字符串截断,末尾自动补上null,输出1234
printf("dst=%s\n", dst);
system("pause");
return 0;
}
推荐使用strncpy_s 加 _TRUNCATE用法。
GCC好像没有实现strncpy_s和strcpy_s,通常使用strncpy就可以了
int main(int argc, char* argv[])
{
char src[] = "1234567890";
char dst[5] = {0};
strncpy(dst, src, sizeof(dst)/sizeof(char) - 1);
printf("dst=%s\n", dst);
return 0;
}
如果超出第三个参数指定的大小,会自动截断,但是dst末尾不会自动补上null,所以dst应该先清零