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

来源:互联网 发布:石原慎太郎 知乎 编辑:程序博客网 时间:2024/05/22 15:22
#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