关于字符串复制函数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″

原因:未知

点赞