C语言标准库函数strlcpy,是更加安全版本的strcpy函数,在已知目的地址空间大小的情况下,把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间,并不会造成缓冲区溢出。
函数原型声明:size_t strlcpy(char *dest, const char *src, size_t size)
头文件引用:#include <string.h>
功能: 在已知dest缓冲区大小并不会造成缓冲区溢出前提下,将src地址开始的字符串复制到以dest开始的地址空间
返回值:src字符串的大小
函数参数:参数dest为目的字符串开始的指针,src为源字符串的开始地址,参数size代表dest字符串的大小
下面为自己实现的一个my_strlcpy函数:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
size_t my_strlcpy(char *des, const char *src, size_t length)
{
int i = 0;
for(i = 0; src[i] != '\0' && i < length - 1; i++)
{
des[i] = src[i];
}
des[i] = '\0';
return strlen(src);
}
void print_buff(char* str, int length)
{
for(int i = 0; i < length; i++)
{
printf("buf[%d] = %c,%d\n", i, str[i], str[i]);
}
}
int main(int argc, char* argv[])
{
char buf[10] = {0};
int ret;
ret = my_strlcpy(buf, "helloworld", sizeof(buf));
printf("%s, ret:%d\n", buf, ret);
print_buff(buf, sizeof(buf));
printf("----------------------------\n");
ret = my_strlcpy(buf, "test", sizeof(buf));
printf("%s, ret:%d\n", buf, ret);
print_buff(buf, sizeof(buf));
return 0;
}
运行结果:
helloworl, ret:10
buf[0] = h,104
buf[1] = e,101
buf[2] = l,108
buf[3] = l,108
buf[4] = o,111
buf[5] = w,119
buf[6] = o,111
buf[7] = r,114
buf[8] = l,108
buf[9] = ,0
----------------------------
test, ret:4
buf[0] = t,116
buf[1] = e,101
buf[2] = s,115
buf[3] = t,116
buf[4] = ,0
buf[5] = w,119
buf[6] = o,111
buf[7] = r,114
buf[8] = l,108
buf[9] = ,0
可以看到,测试的buff数组大小只有10字节,当源字符串为"helloworld”时,函数会在最后一个字节加结束符'\0',缓冲区并不会溢出。