#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″
原因:未知