如何自己实现字符串拷贝函数

本文探讨了字符串复制函数strcpy的常见实现方式及其潜在问题,特别是当源字符串和目标字符串内存区域重叠时可能导致的数据破坏。通过分析,提出了改进版的do_strcpy函数,该函数能够正确处理内存重叠的情况,确保数据的完整性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般写法:


char *my_strcpy(char *dst,const char *src)
{
	assert(dst != NULL);
	assert(src != NULL);
	char *ret = dst;
	while((* dst++ = * src++) != '\0') // 运算符优先级++高于*
		;
	return ret;
}

可以看到很简单,只需考虑三点。

1,判断源字符串和目的字符串是否为空

2,现将目的地址指针保存起来,方便输出

3,遍历原地址和目的地址,一个字符一个字符的复制,包括末尾的

 

但是上面的实现有问题,没有考虑到内存重合的情况。原地址src和目的地址dst所在内存有下面三种情况。

内存重叠​​​

对于1和3的情况,不影响。虽然1也有重叠,但是重叠部分不会破坏源字符串内容。

对于,第二种情况,可以按照从后往前拷贝源字符串内容到目的字符串的思路进行处理。

    void *do_copy(void *dst, const void *src, unsigned int count) {
        assert(dst);
        assert(src);
        void *ret = dst;
        if (dst <= src ||
            (char *)dst >= ((char *)src + count))  //源地址和目的地址不重叠,低字节向高字节拷贝
        {
            while (count--) {
                *(char *)dst = *(char *)src;
                dst = (char *)dst + 1;
                src = (char *)src + 1;
            }
        } else  //源地址和目的地址重叠,高字节向低字节拷贝
        {
            dst = (char *)dst + count - 1;
            src = (char *)src + count - 1;
            while (count--) {
                *(char *)dst = *(char *)src;
                dst = (char *)dst - 1;
                src = (char *)src - 1;
            }
        }
        return ret;
    }

    char *do_strcpy(char *dst, const char *src) {
        assert(dst != NULL);
        assert(src != NULL);
        char *ret = dst;
        do_copy(dst, src, strlen(src) + 1);
        return ret;
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值