strlcpy---实现

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',缓冲区并不会溢出。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值