• 35648

    文章

  • 23

    评论

  • 20

    友链

  • 最近新加了很多技术文章,大家多来逛逛吧~~~~
  • 喜欢这个网站的朋友可以加一下QQ群,我们一起交流技术。

stl实现memcpy,strcpy,strncpy,memmove

欢迎来到阿八个人博客网站。本 阿八个人博客 网站提供最新的站长新闻,各种互联网资讯。 喜欢本站的朋友可以收藏本站,或者加QQ:我们大家一起来交流技术! URL链接:https://www.abboke.com/jsh/2019/0802/103228.html 1190000019952882
char* strcat(char* des, const char* src)   // const表明为输入参数 
{  
    assert((des!=NULL) && (src!=NULL));
    char* address = des;
    while(*des != '\0')  // 移动到字符串末尾
        ++des;
    while(*des++ = *src++)
        ;
    return address;
}
char* strcpy(char* des, const char* src)
{
    assert((des!=NULL) && (src!=NULL)); 
    char *address = des;  
    while((*des++ = *src++) != '\0')  
        ;  
    return address;
}
int strcmp(const char *s1, const char *s2)  
{  
        while (*s1 == *s2++)    
                if (*s1++ == '\0')  
                        return (0);  
        return (*(unsigned char *)s1 - *(unsigned char *)s2);  
}  

int strlen(const char* str)
{
    assert(str != NULL);
    int len = 0;
    while((*str++) != '\0')
        ++len;
    return len;
}
char *
strcat(char *restrict dst, const char *restrict src) {
    const size_t dstlen = strlen(dst);
    const size_t srclen = strlen(src);
    memcpy(dst+dstlen, src, srclen+1);
    return dst;
}

char *
stpcpy(char * restrict dst, const char * restrict src) {
    const size_t length = strlen(src);
    memcpy(dst, src, length + 1);
    return dst + length;
}


char * strncpy(char * restrict dst, const char * restrict src, size_t maxlen) {
    const size_t srclen = strnlen(src, maxlen);
    if (srclen < maxlen) {
        memcpy(dst, src, srclen);
        memset(dst+srclen, 0, maxlen-srclen);
    } else {
        memcpy(dst, src, maxlen);
    }
    return dst;
}
void *memcpy (void *dstpp, const void *srcpp, size_t len)
    {

        unsigned long int dstp = (long int) dstpp;
        if (len >= sizeof(int*))
        {
            len -= (-dstp) % sizeof(int*);
            BYTE_COPY_FWD (dstpp, srcpp, (-dstp) % sizeof(int*));
            WORD_COPY_FWD (dstpp, srcpp, len);
        }

        BYTE_COPY_FWD (dstpp, srcpp, len);
        return dstpp;
    }

    void BYTE_COPY_FWD(void * dstpp, const void * srcpp, size_t len){
        int i=0;
        while(i <= len){
            ((char*)dstpp)[len] = ((char*)srcpp)[len];
            i++;
        }
    }
    void WORD_COPY_FWD(void * dstpp, const void * srcpp, size_t& len){
        int i=0;
        while(i <= len-4){
            ((int*)dstpp)[len] = ((int*)srcpp)[len];
            i+=4;
        }
        len -= i;
    }

    void *memmove (void *dstpp, const void *srcpp, size_t len)
    {

        unsigned long int dstp = (long int) dstpp;
        unsigned long int srcp = (long int) srcpp;
        if (dstp - srcp >= len)
        {
            return memcpy(dstpp,srcpp,len);
        }else{
            srcp += len;
            dstp += len;
            if (len >= sizeof(int*))
            {
                len -= (dstp) % sizeof(int*);
                BYTE_COPY_BWD (dstpp, srcpp, (dstp) % sizeof(int*));
                WORD_COPY_BWD (dstpp, srcpp, len);
            }

            BYTE_COPY_BWD (dstpp, srcpp, len);
            return dstpp;
        };

    }

    void BYTE_COPY_BWD(void * dstpp, const void * srcpp, size_t len){
        while(len-- > 0){
            ((char*)dstpp)[len] = ((char*)srcpp)[len];
        }
    }
    void WORD_COPY_BWD(void * dstpp, const void * srcpp, size_t& len){
        while(len >= 4){
            ((int*)dstpp)[len] = ((int*)srcpp)[len];
            len -= 4;
        }
    }

assert 如果表达式值为假,那么它先向stderr打印错误信息,然后通过调用 abort 来终止程序运行。只在 DEBUG 下生效。宏

危险函数
gets,stpcpy,sprintf等没有检查n直到结尾,会溢出
strncpy,fgetc,read等 当dst长度不足直接在后面补加

fromlng=116.2837, fromlat=40.049619999999997, fromname=云计算创新中心-东南门, fromaddress=海淀区.软件园北街, tolng=116.308211, tolat=40.045464000000003

slat (double) = 40.049779999999998,
02: slng (double) = 116.28313799999999,
03: elat (double) = 40.045520000000003,
04: elng (double) = 116.30843,

相关文章

暂住......别动,不想说点什么吗?
  • 全部评论(0
    还没有评论,快来抢沙发吧!