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

 

发布了62 篇原创文章 · 获赞 8 · 访问量 7924
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览