函数原型
char *strncpy(char *dest, const char *src, size_t n);
实现代码
char * strncpy(char *dest, const char *src, size_t n)
{
size_t i;
for (i = 0; i < n && src[i] != '\0'; i++)
dest[i] = src[i];
for ( ; i < n; i++)
dest[i] = '\0';
return dest;
}
说明
- 函数功能,将字符数组
src
数据拷贝到dest
字符数组中,n
表示要拷贝的字节数。 - 从实现代码中看出,当遇到
\0
字符时,结束拷贝并将dest
后续字符赋值为\0
, 当dest剩余空间很大影响拷贝效率。 - 拷贝数据实际大小等于
n
时,strncpy
不会在结束后添加\0
字符。
实例代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char des_str[100] = {0};
char des_str2[5] = {0};
char src_str[100] = {0};
strcpy(src_str, "123456");
strcpy(src_str + 10, "123456");
// 只会拷贝前6个字节,遇到‘\0’ 自动结束拷贝
strncpy(des_str, src_str, 18);
printf("des_str = [%s]\n", des_str);
printf("des_str = [%s]\n", des_str + 10);
printf("--------------------------------------\n");
strncpy(des_str+10, src_str+10, 18);
printf("des_str = [%s]\n", des_str);
printf("des_str = [%s]\n", des_str + 10);
printf("--------------------------------------\n");
strncpy(des_str2, src_str, sizeof(des_str2));
printf("des_str2 = [%s]\n", des_str2);
printf("size = [%lu]\n", sizeof(des_str2));
// 拷贝不会添加'\0', 拷贝长度 == sizeof(des_str2)
printf("--------------------------------------\n");
printf("don't add \'\\0\' character\n");
strncpy(des_str2, "abcef", sizeof(des_str2));
printf("des_str2 = [%s]\n", des_str2);
printf("size = [%lu]\n", sizeof(des_str2));
// 正确拷贝,如果des_str2空间很大会影响效率
printf("--------------------------------------\n");
memset(des_str2, 0, sizeof(des_str2));
strncpy(des_str2, src_str, sizeof(des_str2)-1);
printf("des_str2 = [%s]\n", des_str2);
printf("size = [%lu]\n", sizeof(des_str2));
return 0;
}