关于字符串复制函数my_strcpy的三种方法

#include <stdio.h>
#include <assert.h>
#define SIZE 16
#define CONTAIN_OF_ZERO_BYTE(n) \
(((n - 0x01010101) & (~n)) & 0x80808080)
                                                    //n=0  0xff & 0xff->0xff
                                                    //n=1  0x00 & 0xfe->0x00
                                                    //n=2  0x01 & 0xfd->0x01……
						   //由上知:只有整个字节都为0时,整个表达式才为真

char* MyStrcpy(char* dest,const char* src)
{
	char* ret = dest;
	assert((dest != NULL) && (src != NULL));  //if ((dest != NULL) && (src != NULL))
		while (*dest++ = *src++);           //while(*src != '\0')
                                             //*dest++ = *src++;
	return ret;
}

char* MyStrcpy1(char* dest,const char* src)
{
    char* ret =dest;
    int delta = dest - src;                 //delta 的作用是用来建立的dest 与src之间的关系
                                            //当进行复制操作时就可以减少对的dest指针运算的时间了,从而优化算法
    assert((dest != NULL) && (src != NULL));
    while(*(char*)(src+delta) = *src++);	//指针(src+delta)其实就是的dest的地址

    return ret;

}

char* MyStrcpy2(char* dest,const char* src)
{
	int* IntDest = (int*)dest;
	int* IntSrc = (int*)src;
	char* ret = dest;

	while(1)
	{
		//判断输入字符中是否有字节为0,没有则执行每四字节复制,否则则执行逐字节复制
		if(!CONTAIN_OF_ZERO_BYTE(*IntSrc))
		{
			*IntDest++ = *IntSrc++;//进行4字节复制
			continue;
		}
		
		dest =(char*)IntDest;
		src =(char*)IntSrc;
		while(*dest++ = *src++);//进行逐字节复制
		break;

	}
	return ret;
}
int main ()
{
	char s1[SIZE];
	char s2[SIZE]="hello123456789";


	printf("s1 = 0x%p\n",s1);
	printf("s2 = 0x%p\n",s2);
	MyStrcpy2(s1,s2);
	printf("s1 = %s\n",s1);

	return 0;
}
注意:上面的三种方法,如果输入两个连续的0都会造成程序奔溃,如输入"hello12300456"
原因:未知
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值